我有一个过程可以进行验证,然后在表中插入一条记录。当我尝试以下代码时,该过程在INSERT
语句之后中断:
EXECUTE IMMEDIATE V_SOME_STRNG || ' returning SOME_ID into :NEW_ID' returning into V_TRGT_ID;
我正在尝试执行存储在INSERT
中的V_SOME_STRNG
语句,并将新记录的ID分配给V_TRGT_ID
。但是,我遇到以下错误:
ORA-00933:SQL命令未正确结束
有什么想法吗?
答案 0 :(得分:3)
您不需要重复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 into
与insert .. 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
答案 1 :(得分:0)
虽然您不需要使用 returning into
部分,但 OP 问题很可能是由 V_SOME_STRNG
变量的未显示内容中的错误引起的。因为您绝对可以将 returning into
与 execute immediate
一起使用。以下是来自 the documentation 的海峡示例:
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 语句。