gpt4 book ai didi

oracle - 在 Oracle 触发器中,我可以将 new 和 old 分配给 rowtype 变量吗?

转载 作者:行者123 更新时间:2023-12-04 00:08:44 29 4
gpt4 key购买 nike

我的任务是实现多个触发脚本,并且我从同事那里得到了一些示例供我引用。其中,他们使用 pl-sql 条件来更新/插入/删除,以及巨大的插入语句(在另一个表中)。这些插入语句除了值是否以 new 或 old 为前缀之外没有变化。我想我会很聪明,并尝试使我的更紧凑,使用以下内容:

DECLARE
vRow SATURN.SPRCMNT%ROWTYPE;

BEGIN

IF UPDATING THEN
vRow := :NEW;
ELSIF INSERTING THEN
vRow := :NEW;
ELSIF DELETING THEN
vRow := :OLD;
END IF;

-- Not the real insert statement
INSERT INTO blah
(columns)
VALUES
(vRow.somecolumns);

END;

我从编译系统得到以下信息:

10/13  PLS-00049: bad bind variable 'NEW'
13/13 PLS-00049: bad bind variable 'NEW'
16/13 PLS-00049: bad bind variable 'OLD'

显然它不喜欢这样。有什么可以实现我正在尝试的东西吗? :new 和 :old 不是真正的行类型吗?将本质上相同的代码重复 3 次似乎很愚蠢,但我想不出更好的方法。 hell ,我想我读到触发器的大小也有一些硬性限制。任何帮助表示赞赏。

[编辑] 只是一个想法,是否可以在 DECODE() 中以某种方式引用 UPDATING/INSERTING 关键字?

例如,如果我可以执行 DECODE(SOMETHINGVAR, UPDATING, :NEW.column, DELETING, :OLD.column),那么我可以使用一条语句设置 vRow 中每一列的值。

我想最好先检查 DELETING,其他两个使用默认值。

这可能吗?

最佳答案

不,你不能。 :new:old 是伪记录,而不是可以分配给局部变量的实际记录。如果您的表基于对象类型,那么 :new:old 将是特定对象类型的实际实例,可以像任何其他对象一样传递。但是,为了让触发器更易于编写而根据对象定义表是不太值得的。

当然,您可以编写一个 PL/SQL 包,通过查询数据字典(即 all_tab_columns 来获取表中的列列表)自动生成您想要的触发代码) 使用动态 SQL。根据您希望编写的触发器数量,这可能比编写和维护大量类似代码更容易。

关于oracle - 在 Oracle 触发器中,我可以将 new 和 old 分配给 rowtype 变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19610295/

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