簡體   English   中英

制作方法:NEW動態PL/SQL

[英]How to make :NEW dynamic PL/SQL

這是我的觸發代碼。 但是我想動態引用: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;

您可以編寫一個 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')

幸運的是,答案非常簡單:你不能這樣做,你必須一個接一個地命名所有值。

不幸的是,沒有任何東西(由 Oracle 提供)可以用於此目的。

不過,您可以嘗試創建自己的過程,該過程將使用動態 SQL 並為您創建觸發器(查詢user_tab_columns以獲取所有列的列表)。 動態 SQL 不能很好地擴展,難以調試,但是 - 如果你認為它會有所幫助(因為你必須創建數百個觸發器) - go 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM