Oracle: использование EXECUTE IMMEDIATE с возвратом в - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть процедура, которая выполняет проверку и вставляет запись в таблицу.Процедура прерывается сразу после оператора INSERT, когда я пытаюсь выполнить следующий код:

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

Я пытаюсь выполнить мой оператор INSERT, который хранится в V_SOME_STRNG, и назначить идентификатор новой записидо V_TRGT_ID.Однако я сталкиваюсь со следующей ошибкой:

ORA-00933: команда SQL неправильно завершена

Есть мысли?

1 Ответ

0 голосов
/ 11 сентября 2018

Вам не нужно повторять часть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...