各位大虾,小弟有问题请教:某个表的字段,会有很多个,如:
INT_COL1
INT_COL2
INT_COL3
.
.
.INT_COL100在触发器中 有没有方法可以动态比较下面(伪代码)语句
condition:
':new.INT_COL'||i|| '<> : old.INT_COL' ||i
其中index是变量,从1,2……100即是类似用循环实现下面的效果:
: new.INT_COL1<> : old.INT_COL1
: new.INT_COL2<> : old.INT_COL2
.
.
.
: new.INT_COL100<> : old.INT_COL100-----------------------------------------------------------
另外我的思路是:execute immediate 'select t.dummy from dual where :new.INT_COL'||i||'<>:old.INT_COL'||i
into compare_result;
if compare_result = 'Y' then
……或者execute immediate 'select t.dummy from dual t where \:new.INT_COL1 <> \:old.INT_COL1 escape :esc_name '
into compare_result
using '\';
if compare_result = 'Y' then
……但是非常遗憾的是,执行起来都是错误,我精疲力竭了,望各位大虾救救我,谢谢了:)

解决方案 »

  1.   

    错误信息是什么?你的触发器中有没有exception控制?
      

  2.   

    应该不行的,在触发器中引用旧值和新值必须使用显式列名。
    在用execute immediate执行
    select t.dummy from dual where :new.INT_COL1<>:old.INT_COL1
    的时候,Oracle把这句查询看作简单的字符串分析而不会把:new.INT_COL1和:old.INT_COL1值传入。
      

  3.   

    写个脚本,自动生成触发器中:NEW.COLi<>:OLD.COLi的语句。
      

  4.   

    不瞒各位大哥,这是小弟第一次写触发器,还真不知道如何调试,我先来个exception 瞅瞅,是怎么报错的,见笑了:)
      

  5.   

    分享一下调试触发器的方法:
    我们在plsql developer,可以建立一个测试存储过程,执行到可以触发触发器的sql时,断点跟入step into便可进入触发器。
    看到怎么兄弟,帮忙,好感动,我以后会经常来的,谢谢:)