Oracle:使用 EXECUTE IMMEDIATE 和 RETURNING INTO

sam*_*amg 1 oracle plsql

我有一个程序可以进行验证并在表中插入一条记录。INSERT当我尝试以下代码时,该过程在语句之后立即中断:

EXECUTE IMMEDIATE V_SOME_STRNG || ' returning SOME_ID into :NEW_ID' returning into V_TRGT_ID; 
Run Code Online (Sandbox Code Playgroud)

我正在尝试执行INSERT存储在中的语句V_SOME_STRNG并将新记录的 ID 分配给V_TRGT_ID. 但是,我遇到了以下错误:

ORA-00933: SQL 命令未正确结束

有什么想法吗?

Ale*_*ole 5

您不需要重复该returning into部分,您using的绑定变量需要一个子句:

EXECUTE IMMEDIATE V_SOME_STRNG || ' returning SOME_ID into :NEW_ID' using out V_TRGT_ID; 
Run Code Online (Sandbox Code Playgroud)

使用基本触发器提供 ID 的演示:

create table t42 (some_id number, dummy varchar2(1));
create sequence s42 start with 42;
create trigger tr42 before insert on t42 for each row
begin
  :new.some_id := s42.nextval;
end;
/

set serveroutput on
declare
  v_some_strng varchar2(200) := 'insert into t42 (dummy) values (''X'')';
  v_trgt_id number;
begin
  EXECUTE IMMEDIATE V_SOME_STRNG || ' returning SOME_ID into :NEW_ID' using out V_TRGT_ID; 
  dbms_output.put_line('Returned ID: ' || v_trgt_id);
end;
/
Run Code Online (Sandbox Code Playgroud)

这表现了:

Returned ID: 42

PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)

您只能returning intoinsert .. values ...模式一起使用,不能与insert ... select ...; 因此,例如更改上面的代码以使用;

  v_some_strng varchar2(200) := 'insert into t42 (dummy) select ''X'' from dual';
Run Code Online (Sandbox Code Playgroud)

将得到您最初报告的错误:

ORA-00933: SQL command not properly ended
ORA-06512: at line 6
Run Code Online (Sandbox Code Playgroud)