我可以复制:OLD和:Oracle存储过程中的新伪记录吗?

aw *_*rud 6 oracle triggers plsql stored-procedures

我有一个AFTER INSERT OR UPDATE OR DELETE,我正在写存储发生在某个表中的每个记录修改的触发,通过复制INSERTUPDATE :NEW值成镜表,并DELETE:OLD值.

我可以通过有条件地将:NEW或者:OLD记录传递给一个程序然后插入我的历史表中来大大地解决我的代码.不幸的是,我似乎找不到通过整个:OLD:NEW记录的方法.

我是否遗漏了某些内容,或者在调用插入过程时是否无法避免枚举每个列:NEW:OLD列?

我想做以下事情:

DECLARE
  PROCEDURE LOCAL_INSERT(historyRecord in ACCT.ACCOUNTS%ROWTYPE) IS
  BEGIN
    INSERT INTO ACCT.ACCOUNTS_HISTORY (ID, NAME, DESCRIPTION, DATE) VALUES (historyRecord.ID, historyRecord.NAME, historyRecord.DESCRIPTION, SYSDATE);
  END;
BEGIN
  IF INSERTING OR UPDATING THEN
    LOCAL_INSERT(:NEW);
  ELSE --DELETING
    LOCAL_INSERT(:OLD);
  END IF;
END;
Run Code Online (Sandbox Code Playgroud)

但我坚持这样做:

DECLARE
  PROCEDURE LOCAL_INSERT(id in ACCT.ACCOUNTS.ID%TYPE,
                         name in ACCT.ACCOUNTS.NAME%TYPE,
                         description in ACCT.ACCOUNTS.DESCRIPTION%TYPE) IS
  BEGIN
    INSERT INTO ACCT.ACCOUNTS_HISTORY (ID, NAME, DESCRIPTION, DATE) VALUES (id, name, description, SYSDATE);
  END;
BEGIN
  IF INSERTING OR UPDATING THEN
    LOCAL_INSERT(:NEW.ID, :NEW.NAME, :NEW.DESCRIPTION);
  ELSE --DELETING
    LOCAL_INSERT(:OLD.ID, :OLD.NAME, :OLD.DESCRIPTION);
  END IF;
END;
Run Code Online (Sandbox Code Playgroud)

好吧,所以它看起来不是一个很大的区别,但这只是一个3列而不是数十列的例子.

Ada*_*sch 3

事实并非如此。你必须自己通过枚举来完成。

它不能/不自动工作的原因包括:

  • :old:new默认约定;您可以通过语句的子句将:old:new引用命名为您想要的任何名称。REFERENCINGCREATE TRIGGER

  • 您必须有一个类型的公共声明(通过CREATE TYPE或通过包声明)才能将其用作另一段代码的参数。

  • 触发代码是解释代码,而不是编译代码。