标签: plsql

plsql存储过程PLS-00103:遇到符号“SELECT”

我尝试在 Oracle 11G 中创建存储过程,但出现以下异常:

Error(7,18): PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:     ( - + case mod new not null <an identifier>    <a double-quoted delimited-identifier> <a bind variable>    continue avg count current exists max min prior sql stddev    sum variance execute forall merge time timestamp interval    date <a string literal with character set specification>    <a number> <a single-quoted SQL string> pipe    <an alternatively-quoted string literal with character set specification>    <an alternat
Error(9,65): PLS-00103: Encountered the symbol …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

1
推荐指数
1
解决办法
2万
查看次数

如何在PLSQL中访问数组

请问,是否可以访问 varray 中的单个值?

像newVariable := myArray(value2)--> 这会将数组中的第二个值分配给新变量...

我还需要这样的东西:

FOR CYCLE...
x++
newVariable(x) := myArray(value(x))
END FOR CYCLE 
Run Code Online (Sandbox Code Playgroud)

是否可以?

谢谢,我是信息技术专业的学生,​​我正在努力解决这个问题。不知道去哪里看...

sql oracle plsql

1
推荐指数
1
解决办法
6776
查看次数

使用 table() 函数连接速度要慢得多

我试图在对象上使用 table() 函数,以便在 PL/SQL 函数中进行联接。使用此功能时,查询可能需要长达 20 分钟才能完成;当我直接将数据输入到表中时,只需要不到 5 秒的时间。我无法弄清楚为什么会有如此显着的差异,但我最好的预感是连接表中列上的索引没有被使用。表和对象的列定义是相同的。

这是一些示例代码:

create or replace type VARCHAR20_TYPE is OBJECT
(
  val varchar2(20 byte);
);

create or replace type VARCHAR20_TABLE is table of VARCHAR20_TYPE;


create or replace FUNCTION test_function( 
    in_project_ids VARCHAR20_TABLE
  ) RETURN INTEGER
  IS
    l_result INTEGER;
  BEGIN

    SELECT count(*) into l_result FROM project p JOIN TABLE(in_project_ids) t ON p.project_id = t.val;      
    RETURN l_result;

  END;
Run Code Online (Sandbox Code Playgroud)

如果我in_project_ids在上面的示例中将其替换为具有相同列定义的真实表的联接,则会显着提高函数的性能。

sql oracle plsql

1
推荐指数
1
解决办法
1890
查看次数

甲骨文10g。导入数据时为模式创建别名

我有一个带有 Oracle 11 的产品盒和一个名为 的架构A。出于测试目的,我需要产品数据的本地快照。数据不是很大,导出不成问题。我已经导出A到一组 SQL 文件(使用 DBeaver),每个表一个,内容如下:

INSERT INTO A.TABLE1 (F1, F2, F3) VALUES ('v11', 'v21', 'v31');
INSERT INTO A.TABLE1 (F1, F2, F3) VALUES ('v12', 'v22', 'v32');
Run Code Online (Sandbox Code Playgroud)

等等。问题是,出于开发目的,我使用名为 的模式B,因此在导入时我需要像这样的插入:

INSERT INTO B.TABLE1 (F1, F2, F3) VALUES ('v11', 'v21', 'v31');
INSERT INTO B.TABLE1 (F1, F2, F3) VALUES ('v12', 'v22', 'v32');
Run Code Online (Sandbox Code Playgroud)

我知道我可以找到并替换所有INSERT INTO A.内容INSERT INTO B.,这将解决我的问题,但也许我可以为模式创建某种别名B,这样我就可以这样做(伪代码):

CREATE ALIAS 'A' FOR SCHEMA 'B'
@TABLE1.sql
@TABLE2.sql
DELETE ALIAS 'A'
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql oracle10g dbeaver

1
推荐指数
1
解决办法
1384
查看次数

用于更新的 PL/SQL 触发器

我有两个具有相同结构和相同数据的emp表。copy_emp我希望如果发生任何变化都emp应该反映在copy_emp. 因此我创建了一个触发器,如下所示。

create or replace trigger t
after
insert or
update of empno or
delete
on emp
for each row
begin
case
when inserting then
  insert into copy_emp(empno,ename,sal) values (:NEW.empno,:NEW.ename,:NEW.sal);
when updating then
  if updating('empno') then
    update copy_emp set copy_emp.empno=:new.empno where copy_emp.empno=:old.empno;
  elsif updating('ename') then
    update copy_emp set copy_emp.ename=:new.ename where copy_emp.ename=:old.ename;
  elsif updating('sal') then
    update copy_emp set copy_emp.sal=:new.sal where copy_emp.sal=:old.sal;
end if;
when deleting then
  delete from copy_emp where empno = :old.empno; …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

1
推荐指数
1
解决办法
6546
查看次数

Oracle 过程出错,对象无效

错误在哪里?编译以错误结束,我不知道哪里出了问题。

create or replace
PROCEDURE make_payoff(user_id_argument number) 
is
begin
payoff_amount:= 0;
CURSOR Clicks IS
    SELECT c.cpc FROM click as c JOIN widget w ON w.id = c.widget_id JOIN website web ON web.id = w.website_id WHERE web.user_id = user_id_argument AND c.payoff_id IS NULL;
BEGIN
FOR Click IN Clicks
LOOP
    payoff_amount:= payoff_amount + Click.cpc;
END LOOP;

INSERT INTO payoff (user_id, amount) VALUES (user_id_argument, payoff_amount);
COMMIT;
end;
Run Code Online (Sandbox Code Playgroud)

我越来越:

ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00905: object S10306.MAKE_PAYOFF is invalid
ORA-06550: …
Run Code Online (Sandbox Code Playgroud)

oracle plsql stored-procedures

1
推荐指数
1
解决办法
3万
查看次数

替换 Oracle 变量中的 CLOB 文本

我有一个 Oracle 过程,它接受参数 (v_MessageText) 来更新表上名为 message_text 的列。message_text 列是 CLOB。我希望能够替换输入中的文本,因此如果用户输入 testABC ,它会将 testXYZ 输出到 message_text 列中。起初,这看起来很简单。我尝试在我的程序中运行下面的代码,但出现错误:

    SELECT REPLACE (v_MessageText, 'ABC', 'XYZ') from dual;
Run Code Online (Sandbox Code Playgroud)

Oracle 给我的错误是:“PLS-00428:此 select 语句中需要一个 INTO 子句”。为什么?我在这里做错了什么?

oracle plsql replace clob

1
推荐指数
1
解决办法
2万
查看次数

为什么不允许在 PL/SQL 触发器中使用 ROLLBACK 语句,但 RAISE_APPLICATION_ERROR 可以?

如果我错了,请纠正我,但我的印象是调用 RAISE_APPLICATION_ERROR() 会强制回滚。为什么在 PL/SQL 触发器中允许调用 RAISE_APPLICATION_ERROR(),而不允许 ROLLBACK 语句和/或执行 ROLLBACK 语句的方法呢?

我感觉我错过了一个关键点:)

提前致谢!

oracle triggers plsql rollback

1
推荐指数
1
解决办法
4889
查看次数

通过 EXECUTE IMMEDIATE 从 select 语句返回值

我搜索了一些如何使用立即执行从 select 语句返回值的示例,但它不断返回错误“ORA-00903:无效的表名”。

这是代码示例:

DECLARE
  LAST_NUMBER NUMBER;

  CURSOR C_SEQUENCES IS
    SELECT
      A.SEQUENCE_NAME, B.TABLE_NAME, C.COLUMN_NAME
    FROM
      USER_SEQUENCES A
    INNER JOIN
      USER_CONSTRAINTS B ON A.SEQUENCE_NAME = REPLACE(B.CONSTRAINT_NAME, 'PK', 'SEQ_ID')
    INNER JOIN
      USER_CONS_COLUMNS C ON B.CONSTRAINT_NAME = C.CONSTRAINT_NAME
    WHERE
      B.CONSTRAINT_TYPE = 'P';

BEGIN
  FOR REG IN C_SEQUENCES LOOP
    EXECUTE IMMEDIATE 'SELECT MAX(:1) FROM :2' INTO LAST_NUMBER USING REG.COLUMN_NAME, REG.TABLE_NAME;
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

是的,该表确实存在。

有任何想法吗?

oracle plsql

1
推荐指数
1
解决办法
5884
查看次数

Oracle PL/SQL 的 dbms_output.put_line() 与 dbms_output.put()

我有一个小问题,我还不明白 dbms_output.put_line() 和 dbms_output.put() 之间的区别

set serveroutput on size 200000
Begin
dbms_output.put_line('A' || CHR(10) || 'B');
End;
/

exec dbms_output.put_line('A' || CHR(10) || 'B');
Run Code Online (Sandbox Code Playgroud)

上面给出了两行不同的输出A和B。但

exec dbms_output.put('A')
exec dbms_output.put('B')
exec dbms_output.new_line
Run Code Online (Sandbox Code Playgroud)

不打印任何内容。我正在使用SQL*Plus:版本 11.2.0.1.0 生产

oracle plsql sqlplus

1
推荐指数
1
解决办法
9025
查看次数