Oracle: Using EXECUTE IMMEDIATE with RETURNING INTO



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

EXECUTE IMMEDIATE V_SOME_STRNG || ' returning SOME_ID into :NEW_ID' returning into V_TRGT_ID; 

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

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

有什么想法吗?

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

EXECUTE IMMEDIATE V_SOME_STRNG || ' returning SOME_ID into :NEW_ID' using out V_TRGT_ID; 

演示使用基本触发器提供 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;
/

其中显示:

Returned ID: 42
PL/SQL procedure successfully completed.

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

v_some_strng varchar2(200) := 'insert into t42 (dummy) select ''X'' from dual';

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

ORA-00933: SQL command not properly ended
ORA-06512: at line 6

虽然您不需要使用returning into部分,但 OP 问题很可能是由于V_SOME_STRNG变量未显示的内容中的错误造成的。因为您绝对可以将returning intoexecute immediate一起使用。以下是文档中的示例:

sql_stmt := 'UPDATE emp SET sal = 2000 WHERE empno = :1 RETURNING sal INTO :2';
EXECUTE IMMEDIATE sql_stmt USING emp_id RETURNING INTO salary;

我再次强调一点:它有效。因此,如果您在这里遇到任何问题,请更彻底地检查动态生成的SQL语句。

我的test_queries表由 2 列组成:fid 和 query_text。我想插入新行。我返回我插入的 fid,因为我在下一个问题使用它。但是代码给了我错误.

从 test_queries A 中选择最大值 (a.fid( 到 max_fid; 立即执行"插入test_queries值 (:1,:2( 将 FID 返回到 :a",使用 max_fid+1,query_text,c;

最新更新