我有一个表,结构如下:
t1
f1 varchar2(20)  pk,
f2 varchar2(20),
f3 varchar2(20),
f4 varchar2(20),
f5 varchar2(20),
f6 varchar2(20),
f7 varchar2(20)我想对t1做一个触发器:
CREATE OR REPLACE TRIGGER t1_tri
   after INSERT OR UPDATE
   ON t1    FOR EACH ROW
BEGIN   tttt(:NEW.f1);
END;
tttt如下所示:
procedure tttt(p_val in varchar2)
is
begin
insert into t2(f1,f2,f3,f4,f5,f6,f7)
select f1,f2,f3,f4,f5,f6,f7
from t1
where f1=p_val;
end;当对t1进行update时,报错:
表t1发生变化,触发器/函数不能读取它。
如何解决啊?多谢高手指点!

解决方案 »

  1.   

    首先有点疑惑,就是t1触发这个触发器,要在t2中插入数据,为什么还要单独写一个存储过程呢?
    直接在触发器代码中插入即可。其次,如下代码有问题:insert into t2(f1,f2,f3,f4,f5,f6,f7)
    select f1,f2,f3,f4,f5,f6,f7
    from t1
    where f1=p_val;
    先执行insert, f1到f7变量没定义
    select语句没有into子句,不允许。
      

  2.   

    oracle触发器的自治事务可以的。
      

  3.   

    不知道 oracle触发器的自治事务
    是如何实现,能说得详细点吗?多谢!