你原来的错误在于触发器执行前并没有执行COMMIT操作,所以表中仍旧为原来的数据;
改成下面的试一下,因该能满足你的要求了,而且SQL程序中不到万不得已不要用游标:
CREATE OR REPLACE TRIGGER yl_test03
BEFORE insert on a01
for each row
begin
delete from b01 WHERE (b01.ID = :NEW.ID ) AND (b01.NAME = :NEW.NAME);
insert into b01(id,name) values(:NEW.id,:NEW.name);
end yl_test03;
改成下面的试一下,因该能满足你的要求了,而且SQL程序中不到万不得已不要用游标:
CREATE OR REPLACE TRIGGER yl_test03
BEFORE insert on a01
for each row
begin
delete from b01 WHERE (b01.ID = :NEW.ID ) AND (b01.NAME = :NEW.NAME);
insert into b01(id,name) values(:NEW.id,:NEW.name);
end yl_test03;
create or replace trigger yl_test03
after insert on a01
for each row
begin
insert into b01(id,name)
values(:new.cur01_rec.id,:new.cur01_rec.name);
end yl_test03;
/
原来数据与新增数没冲突的.
但为何after后用游标不行,好像只要操作本表时就出错
create or replace trigger yl_test03
after insert on a01
for each row
declare
id1 a01.id%type;
begin
select id into id1 from a01 where id=:new.id;
end;
ORA-04091: 表 YLMIS.A01 发生了变化,触发器/函数不能读告诉小弟为何游标不好用.
我记得AFTER后只能用:OLD来去原来的值(记不清了,希望不会误导你,);
你这个触发器没有定义游标,我不知道错在哪了?理论上是可以的,每个都要调试才知道错误所在!
不用游标是因为在数据量较大时游标的效率非常低,要提高效率非常困难,
我前几天用游标时花了10天才提高了20倍,游标的功能可以用其他的方法实现,效率都挺高的。
不知道你还有什么问题,讲来大家研究一下!!!
如select id into id1 from a01 where id=:new.id; 会出错,象第一个帖子里的
游标也引用了after后的新主表.
还想请教一个新问题,在过程或函数中的形参如何定义游标,必须用包吗
必须在 AS 后立即声明(BEGIN之前)才不会错误,打包是没有必要的
package Yjs_cwjk
is
type TCursor is ref cursor;
procedure GetYjs_ckdj(Cur OUT TCursor);
end;
/
create or replace
package body Yjs_cwjk
is
procedure GetYjs_ckdj(Cur OUT TCursor)
is
begin
OPEN Cur FOR
SELECT *
FROM Yjs_ckdj
ORDER BY ckdh;
end;
end;在包中好用但不用包无法声明游标