是否可以使用变量来引用Oracle触发器中的列?

问题描述

我在旧版Oracle 9数据库中有一个表。我正在尝试编写一个触发器,该触发器将对该表中的行进行更新,从而循环遍历表的各个列,并为C的每个列检查是否:old[C] = :new[C]

是否可以通过使用一些变量作为列名来引用:old:new的列数据?

解决方法

首先,您无法通过此查询找到所有表列:

SELECT *
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'my_table';

第二,为了遍历这些列以测试新旧值,您可以使用以下命令编写查询:EXECUTE IMMEDIATE ('<my query>');,例如:

CREATE OR REPLACE TRIGGER [...]
    l_cnt NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM DUAL WHERE '||:old.C||' = '||:new.C INTO l_cnt;
END;

更新1:

您也可以“手动”完成操作,并手动测试每一列,如下所示:

CREATE OR REPLACE TRIGGER BEFORE UPDATE OF [...]
BEGIN
    IF :old.A != :new.A THEN
        --field A has changed
    ELSIF :old.B != :new.B THEN
        --field B has changed
    ELSIF :old.C != :new.C THEN
        --field C has changed
--continue with other fields
    END IF;
END;

编辑:将ALL_TAB_COLUMNS更改为USER_TAB_COLUMNS