2010-01-21 106 views
2

我有這樣的觸發:該行級別觸發器失敗?

create or replace trigger t_calctotal 
after insert or update on item_fornecimento 
REFERENCING NEW AS NEW OLD AS OLD 
for each row 

begin 

    if inserting then 
    dbms_output.put_line(' On Insert'); 
    update fornecimento f set f.total_enc_fornec = f.total_enc_fornec +:NEW.prec_total_if where f.id_fornecimento = :NEW.id_fornecimento; 

    else 
    dbms_output.put_line(' On Update'); 
    update fornecimento f set f.total_enc_fornec = f.total_enc_fornec - :OLD.prec_total_if +:NEW.prec_total_if where f.id_fornecimento = :NEW.id_fornecimento; 

    end if; 

end; 

基本上我要刷新的順序(fornecimento)的合計值,通過在suming item_fornecimento的所有項目;我必須以不同的方式處理這種情況,如果是插入,就是更新。 觸發器編譯和所有,甚至一次,但它是唯一一個。我已經插入或在的SQLDeveloper更新了我的prec_total_if在item_fornecimento,但直到它由該觸發器插入值替換訂單的(fornecimento)總還是沒有改變:(。

如果是很重要的,我f.total_enc_fornec它爲空;它打印輸出,但它似乎無法更新

回答

6

只要你知道:空+ 123 = NULL

我猜想,解釋它的總初始化爲0,一切都應該工作

編輯

你可以這樣說:

if inserting then 
    dbms_output.put_line(' On Insert'); 
    update fornecimento f set f.total_enc_fornec = nvl(f.total_enc_fornec, 0) +:NEW.prec_total_if where f.id_fornecimento = :NEW.id_fornecimento; 

else 
dbms_output.put_line(' On Update'); 
update fornecimento f set f.total_enc_fornec = nvl(f.total_enc_fornec, 0) - :OLD.prec_total_if +:NEW.prec_total_if where f.id_fornecimento = :NEW.id_fornecimento; 

end if; 
+0

Tks,我已經做到了。這是搶購的代價! – neverMind 2010-01-21 21:34:54

0

你的觸發器將在多用戶環境中失敗,除非你在父級別執行某種序列化。

如果在周圍item_fornecimento同一時間更新不同的行具有相同id_fornecimento兩會上,fornecimento.total_enc_fornec會被錯誤地更新,因爲每個會話不會看到其他會議上所作提交的更改。

爲了解決這個問題,你可能會編寫你的應用程序的代碼,在更新/插入它的項目之前嘗試對父記錄fornecimento進行排它鎖定。