gpt4 book ai didi

oracle - 我可以复制 :OLD and :NEW pseudo-records in/to an Oracle stored procedure?

转载 作者:行者123 更新时间:2023-12-04 15:27:58 25 4
gpt4 key购买 nike

我有一个 AFTER INSERT OR UPDATE OR DELETE通过复制 INSERT 来存储在某个表中出现的每个记录修订的触发器。和 UPDATE :NEW值到镜像表中,对于 DELETE :OLD值(value)观。

我可以通过有条件地传递 :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, 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;

好的,所以看起来差别不大,但这只是一个有 3 列而不是几十列的示例。

最佳答案

它不是。你必须通过枚举自己做。

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

  • :old:new是默认约定;您可以命名 :old:new通过 REFERENCING 引用任何你想要的东西CREATE TRIGGER 的子句陈述。
  • 您必须拥有一个类型的公共(public)声明(通过 CREATE TYPE 或通过包声明)才能将其用作另一段代码的参数。
  • 触发代码是解释代码,而不是编译代码。
  • 关于oracle - 我可以复制 :OLD and :NEW pseudo-records in/to an Oracle stored procedure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2337325/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com