2010-10-29 65 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; 
/