2010-10-29 60 views
0

我想更新觸發觸發器的相同記錄。我已經使用「BEFORE INSERT」 選項完成了該操作。但請注意,如果存在任何錯誤,我使用事務來回滾操作。更新觸發觸發器的相同記錄

CREATE OR REPLACE TRIGGER GANUKA.INTF_CONTROLLER_UPLOADER 
BEFORE insert ON GANUKA.INTF_CONTROLLER for each row 
DECLARE 
    PRAGMA AUTONOMOUS_TRANSACTION; 
    max_id INTEGER; 
    stat VARCHAR2(32); 
begin 

select :new.id into max_id from dual; 
select :new.status into stat from dual; 



IF STAT = 'NEW' THEN --ONLY NEW UPLOADS WILL CONTINUE FOR PROCESS 
    :NEW.STATUS := 'STARTED'; 
    max_id := GANUKA.BACKOFFICE_UPDATE(max_id); --PL/SQL function 
    :NEW.STATUS := 'COMPLETED'; 

ELSE 
    :NEW.STATUS := 'ABORTED'; 
    :NEW.REMARKS :='STATUS IS NOT RECONGNIZED'; 

END IF; 

COMMIT; 

EXCEPTION 
    WHEN OTHERS 
    THEN 
     ROLLBACK; 
     RAISE; 

end; 
/

問題是如果有任何異常我想更新記錄以將狀態設置爲'失敗'。任何人都可以告訴我該怎麼做。

+0

爲什麼不是'GANUKA.BACKOFFICE_UPDATE()'函數狀態設置爲'STARTED',然後是'COMPLETED'或'FAILED'爲合適?這可能是一個'AFTER INSERT'觸發器,只是調用'NEW'記錄的函數。 (事實上​​,無論如何,「STARTED」狀態從來都不會出現)。我想你可能會遇到更新同一記錄的鎖定問題。 – 2010-10-29 11:52:27

+0

據我所知,我們不能使用'AFTER INSERT'選項並使用'NEW'關鍵字更新相同的記錄。這是我的問題。有沒有辦法使用「AFTER INSERT」並更新相同的記錄? – nath 2010-10-29 12:08:52

+3

我只是不認爲觸發器是正確的方式來做到這一點。爲什麼不寫一個PL/SQL過程? – 2010-10-29 12:36:30

回答

0

我不知道你爲什麼在這裏使用自治事務,爲什麼你有在觸發提交/回滾...

+0

表之間有幾個數據事務。所以我需要確保數據傳輸沒有任何問題。如果出現任何故障,我需要回滾整個過程。但需要保留觸發觸發器的記錄並將其狀態更新爲'失敗' – nath 2010-10-29 11:55:11

+5

然後先執行「INSERT」,調用PL/SQL函數。如果出現故障,則回滾,然後是另一個標記爲「失敗」的「INSERT」。觸發器是半惡,自治交易是半惡。把它們結合起來是完全邪惡的! – 2010-10-29 12:27:48

0

這是否做到這一點?

CREATE OR REPLACE TRIGGER GANUKA.INTF_CONTROLLER_UPLOADER 
BEFORE insert ON GANUKA.INTF_CONTROLLER for each row 
DECLARE 
    max_id INTEGER; 
    stat VARCHAR2(32); 
begin 

max_id := :new.id; 
stat := :new.status; 

IF STAT = 'NEW' THEN --ONLY NEW UPLOADS WILL CONTINUE FOR PROCESS 
    DECLARE 
     PRAGMA AUTONOMOUS_TRANSACTION; 
    BEGIN 
     max_id := GANUKA.BACKOFFICE_UPDATE(max_id); --PL/SQL function 
     COMMIT; 
     :NEW.STATUS := 'COMPLETED'; 
    EXCEPTION 
     WHEN OTHERS THEN 
     ROLLBACK; 
     :new.status := 'FAILED'; 
    END; 

ELSE 
    :NEW.STATUS := 'ABORTED'; 
    :NEW.REMARKS :='STATUS IS NOT RECONGNIZED'; 

END IF; 

end; 
/