【发布时间】:2010-10-21 15:59:06
【问题描述】:
在触发器内部,我试图遍历表中的所有列,并将新值与旧值进行比较。这是我目前所拥有的:
CREATE OR REPLACE TRIGGER "JOSH".TEST#UPD BEFORE
UPDATE ON "JOSH"."TEST_TRIGGER_TABLE" REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW
declare
oldval varchar(2000);
newval varchar(2000);
begin
for row in (SELECT column_name from user_tab_columns where table_name='TEST_TRIGGER_TABLE') loop
execute immediate 'select :old.'||row.column_name||' from dual' into oldval;
execute immediate 'select :new.'||row.column_name||' from dual' into newval;
--Do something here with the old and new values
end loop;
end;
触发器编译,但是当触发器触发时,我得到:
ORA-01008:并非所有变量都绑定
在第一次执行时立即执行,因为它需要 :old 的值。 :old 和 :new 已经定义为触发器的一部分,但执行立即似乎看不到这些变量。
有没有办法动态迭代触发器中的列值?
【问题讨论】:
-
只有当您指定触发器为 FOR EACH ROW 时,:old 和 :new 关键字才可用。
-
对,指定了“FOR EACH ROW”。问题是我试图在动态 sql 语句中引用它们。
-
刚刚添加了我用来创建触发器以避免混淆的完整 DDL。
标签: oracle dynamic plsql database-trigger