Вам не нужно повторять часть returning into
, вам нужно выражение using
для переменной связывания:
EXECUTE IMMEDIATE V_SOME_STRNG || ' returning SOME_ID into :NEW_ID' using out V_TRGT_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