问题描述
我在旧版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