2010-07-16 40 views
2

我创建了一个触发器,它可以在两个表上工作: - 在表A上插入一个新行(GEDDFILES)时,表B(GEDDIRS)上的数字字段将增加。Oracle触发器不起作用

代码正在编译没有错误,但它不起作用。代码是波纹管:

CREATE OR REPLACE TRIGGER "A"."TRGMAJNRFIC" AFTER 
INSERT ON "A"."GEDFILES" FOR EACH ROW DECLARE 
wtmpnrfic number; 

BEGIN 
SELECT MAX(OBJNRFICHIERS) INTO wtmpnrfic from GEDDirs WHERE ID= :new.ID; 
UPDATE GEDDirs SET OBJNRFICHIERS = wtmpnrfic+1 WHERE ID=:new.id; 
END; 

表是从GEDDIRS(字段ID)是FK在表GEDFILES(字段ID)

我不能找出其中的问题,即使是归一化和PK小家伙。

表格GEDFILES的字段OBJNRFICHIERS为空。当我试图增加它的价值时,这可能会成为问题吗?

+1

它看起来像你试图维护一个表中的“记录数”。您应该认识到,在并发会话存在的情况下,对于相同的'GEDDirs.ID',将新行添加到'GEDFILES'时不起作用。 “OBJNRFICHIERS”中的数据可能会变成垃圾。 – 2010-07-16 13:01:43

+0

是的,你是对的!我该如何解决这个问题?你能提供一个替代解决方案吗? 最好的问候, – RBA 2010-07-16 15:05:21

+0

添加DBMS_OUTPUT.PUT_LINE('tirgger works');为您的触发器并连接到dmbs输出。 – deathangel908 2016-02-16 10:38:32

回答

0

我解决了它。问题在于字段OBJNRFICHIERS为空。触发代码是波纹管

CREATE OR REPLACE TRIGGER "A"."TRGMAJNRFIC" AFTER 
INSERT ON "A"."GEDFILES" FOR EACH ROW DECLARE 
wtmpnrfic number; 

BEGIN 
SELECT MAX(OBJNRFICHIERS) INTO wtmpnrfic from GEDDirs WHERE ID= :new.ID; 
IF wtmpnrfic IS NULL then wtmpnrfic :=0; 
ELSE wtmpnrfic := wtmpnrfic+1; 
UPDATE GEDDirs SET OBJNRFICHIERS = wtmpnrfic+1 WHERE ID=:new.id; 
END IF; 
END; 

谢谢大家的建议,也欢迎其他建议! +1所有的答案

4

简单的问题:你有没有启用你的触发器?

http://www.techonthenet.com/oracle/triggers/enable.php

编辑:现在我看到你描述OBJNRFICHIERS从表GEDFILES为空。将0(零)放在该列上并运行测试...可能是这个问题! :)

+0

是的。我现在启用了触发器并运行一个“提交”。 我已经做了测试,不起作用。 – RBA 2010-07-16 07:30:26

+0

在桌子上插入一行GEDDFILES后,你是否正在提交? – 2010-07-16 07:47:11

+1

您是否已经从表格GEDFILES的列OBJNRFICHIERS中插入值0? – 2010-07-16 08:01:44

2

这是使用NVL2使代码有点清洁的好地方:

CREATE OR REPLACE TRIGGER "A"."TRGMAJNRFIC" 
    AFTER INSERT ON "A"."GEDFILES" 
    FOR EACH ROW 
DECLARE 
    wtmpnrfic number; 
BEGIN 
    SELECT MAX(OBJNRFICHIERS) 
    INTO wtmpnrfic 
    from GEDDirs 
    WHERE ID = :new.ID; 

    UPDATE GEDDirs 
    SET OBJNRFICHIERS = NVL2(wtmpnrfic, 0, wtmpnrfic+1); 
    WHERE ID = :new.ID; 
    END IF; 
END; 

或者,如果你喜欢,你可以使用COALESCE来代替NVL2线以上:

SET OBJNRFICHIERS = COALESCE(wtmpnrfic+1, 0); 

或者,我想,NVL将工作一样好:

SET OBJNRFICHIERS = NVL(wtmpnrfic+1, 0); 

分享和享受。

+0

不错的主意!为此+1! – RBA 2010-07-16 12:37:10