Ошибка в Dynami c Запрос внутри Oracle триггера - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь создать запрос для преобразования новых данных таблицы в xml в триггере

create or replace TRIGGER EVAL_CHANGE_TriggerActual_Test
  AFTER INSERT OR UPDATE OR DELETE
  ON PROJ_TEST
  REFERENCING NEW AS new OLD AS old
 FOR EACH ROW
DECLARE
 p_xmldata     XMLtype;
  P_NEWROWDATA    clob;
  p_newrowxml       clob;  
BEGIN

p_newrowxml:='select XMLElement("ResearchTable",XMLElement("DESCR", :NEW.DESCR)) from dual';
EXECUTE IMMEDIATE  p_newrowxml  into p_xmldata   ; //Error here 
 p_newrowdata:=p_xmldata.getClobVal();  
END;

Если я удалю NEW.DESCR на некоторую c, она будет работать

NB: мне нужно сохранить запрос в виде строки, потому что позже он будет сгенерирован каким-то SP

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Выглядит как мысль: NEW недоступно в контексте утверждения. Можете ли вы использовать p_newrowxml:='select XMLElement("ResearchTable",XMLElement("DESCR", :1)) from dual'; EXECUTE IMMEDIATE p_newrowxml into p_xmldata using :NEW.DESCR;

0 голосов
/ 14 июля 2020

Одним из решений может быть присвоение нового значения переменной, а затем использование переменной в операторе Dynami c sql.

create or replace TRIGGER EVAL_CHANGE_TriggerActual_Test
  AFTER INSERT OR UPDATE OR DELETE
  ON PROJ_TEST
  REFERENCING NEW AS new OLD AS old
 FOR EACH ROW
DECLARE
 p_xmldata     XMLtype;
  P_NEWROWDATA    clob;
  p_newrowxml       clob;  
  my_var          PROJ_TEST.descr%type;
BEGIN
my_var := :new.descr;
p_newrowxml:='select XMLElement("ResearchTable",XMLElement("DESCR", '||my_var||' )) from dual';
EXECUTE IMMEDIATE  p_newrowxml  into p_xmldata   ; 
 p_newrowdata:=p_xmldata.getClobVal();  
END;
...