当前位置:数据库 > Oracle >>

oracle触发器

现有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中遇到“监听程序未启动或数据库服务未注册到该监听程序”该怎么办 我的监听程序已经启动了

Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,