微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决是否可以使用变量来引用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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。