Как сделать: НОВЫЙ динамический PL / SQL - PullRequest
0 голосов
/ 27 сентября 2019

Это мой триггерный код.Но я хочу динамически ссылаться на атрибуты :new, не записывая их один за другим.Как я могу это сделать?

create or replace TRIGGER test_CHANGE_TRIGGER
  AFTER INSERT OR UPDATE OR DELETE
  ON test
  FOR EACH ROW
BEGIN
   IF INSERTING THEN
      INSERT INTO test_LOG 
      VALUES (:NEW.d, :NEW.s, :NEW.n, :NEW.v, :NEW.e, SYSDATE, USER, 'I');
   END IF;
END;

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Вы можете написать SQL-оператор для генерации оператора вставки для вас.Скопируйте результат и вставьте его в код триггера.Пример для таблицы emp:

SELECT 
'INSERT INTO emp_log(empno,ename, job, mgr, hiredate, sal, comm, deptno, log_date, user, operation) VALUES ('||
':NEW.'||LISTAGG(column_name,' ,:NEW.') WITHIN GROUP(order by column_id)||',SYSDATE,USER,''I'')' 
 FROM user_tab_columns 
WHERE table_name = 'EMP';

Это вернет

INSERT INTO emp_log(empno,ename, job, mgr, hiredate, sal, comm, deptno, log_date, user, operation) VALUES (:NEW.EMPNO ,:NEW.ENAME ,:NEW.JOB ,:NEW.MGR ,:NEW.HIREDATE ,:NEW.SAL ,:NEW.COMM ,:NEW.DEPTNO,SYSDATE,USER,'I')
0 голосов
/ 27 сентября 2019

К счастью, ответ довольно прост: вы не можете этого сделать, и вы должны назвать все значения по одному.

К сожалению, вы ничего не можете использовать (предоставленный Oracle)для этой цели.

Хотя вы можете попытаться создать собственную процедуру, которая будет использовать динамический SQL и создавать для вас триггеры (запросите user_tab_columns, чтобы получить список всех столбцов).Динамический SQL плохо масштабируется, его сложно отладить, но - если вы думаете, что это поможет (потому что вам нужно создать сотни триггеров) - сделайте это.

...