2010-07-16 41 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