oracle触发器
现有2张表A,B,表结构一样,其中有字段id,dm,现在要在A表上做一个触发器,讲A表中的数据触发到B表,在触发的时候做一个判断,先看触发的数据中dm字段在B表中是否存在,若不存在,则执行insert,若存在则执行update,在update的时候还要再做一次判断,如果dm一样,看id的值是否大于old.id,大于则更新,否则不执行。我现在做的触发器,触发后老是有2条一模一样的数据(id不一样)
现有2张表A,B,表结构一样,其中有字段id,dm,现在要在A表上做一个触发器,讲A表中的数据触发到B表,在触发的时候做一个判断,先看触发的数据中dm字段在B表中是否存在,若不存在,则执行insert,若存在则执行update,在update的时候还要再做一次判断,如果dm一样,看id的值是否大于old.id,大于则更新,否则不执行。我现在做的触发器,触发后老是有2条一模一样的数据(id不一样)
答案:这样试试吧,应该可以的,我这里测试通过了,要ORACLE 10g
CREATE OR REPLACE TRIGGER ERP.inset_a
AFTER INSERT
ON TEST_A
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
tmpVar NUMBER;
BEGIN
MERGE INTO TEST_B USING (SELECT :NEW.ID,:NEW.DM DM FROM DUAL) T
ON (TEST_B.DM=T.DM )
WHEN NOT MATCHED THEN
INSERT VALUES(:NEW.ID,:NEW.DM)
WHEN MATCHED THEN
UPDATE SET TEST_B.ID=:NEW.ID
WHERE TEST_B.DM=:NEW.DM AND TEST_B.ID <:NEW.ID;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END inset_a;
其他:你是不是使用提交了啊。解发器自动提交的。 触发器的触发条件有写错不?AFTER INSERT先做的啊?:OLD 和 :NEW有没有写错,检查一下。无论触发器写什么,除非你在BEFORE里面写,判断之后返回出错,就不插入记录,否则本来就插入一条记录了,如果你在触发器再判断插入多一次,当然就变成两条啦。。。
如果还有问题,请给出代码。 建议不要用触发器, 触发器对于oracle来说简直就是多余的
上一个:oracle视图中怎么加order by ??
下一个:oracle中遇到“监听程序未启动或数据库服务未注册到该监听程序”该怎么办 我的监听程序已经启动了