我可以复制: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或通过包声明)才能将它用作另一段代码的参数.>触发代码是解释代码,而不是编译代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |