我的任务是实现几个触发脚本,并且我从同事那里得到了一些例子。其中,他们使用 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 次似乎很愚蠢,但我想不出更好的方法。地狱,我想我读到触发器的大小也有一些硬性限制。任何帮助表示赞赏。
[编辑] 只是一个想法,是否可以在 DECODE() 中以某种方式引用 UPDATING/INSERTING 关键字?
例如,如果我可以做一个 DECODE(SOMETHINGVAR, UPDATING, :NEW.column, DELETING, :OLD.column) 那么我可以用一条语句设置 vRow 中每一列的值。
我想最好先检查 DELETING,然后对其他两个使用默认值。
这可能吗?