加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 16:29:05 所属栏目:百科 来源:网络整理
导读:我有一个AFTER INSERT或UPDATE OR DELETE触发器,我正在编写以存储在某个表中发生的每个记录修订,方法是将INSERT和UPDATE:NEW值复制到镜像表中,并删除:OLD值. 通过有条件地将:NEW或:OLD记录传递到一个过程,然后插入到我的历史记录表中,我可以大大地解决我
我有一个AFTER INSERT或UPDATE OR DELETE触发器,我正在编写以存储在某个表中发生的每个记录修订,方法是将INSERT和UPDATE:NEW值复制到镜像表中,并删除: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;

但我坚持这样做:

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,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;

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

事实并非如此.你必须通过枚举自己做.

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

>:old和:new是默认约定;您可以通过CREATE TRIGGER语句的REFERENCING子句将:old和:new引用命名为您想要的任何内容.>你必须有一个类型的公开声明(通过CREATE TYPE或通过包声明)才能将它用作另一段代码的参数.>触发代码是解释代码,而不是编译代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读