2010-10-29 7 views
0

Je souhaite mettre à jour le même enregistrement qui déclenche un déclencheur. Je l'ai fait en utilisant "BEFORE INSERT" option . Mais notez que j'ai utilisé une transaction pour annuler l'opération s'il y a une erreur.mettre à jour le même enregistrement qui déclenche un déclencheur

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; 
/

Le problème est qu'il existe une exception quelconque que je veux mettre à jour l'enregistrement pour définir l'état comme 'Échec'. Quelqu'un peut-il me dire comment faire cela.

+0

Pourquoi pas la fonction 'GANUKA.BACKOFFICE_UPDATE()' régler le statut 'route', puis soit' 'ou failed' accompli le, le cas échéant? Cela pourrait alors être un déclencheur 'AFTER INSERT' pour appeler simplement la fonction pour les enregistrements' NEW'. (Comme c'est le cas, le statut 'STARTED' n'est jamais vu nulle part de toute façon). Vous avez peut-être des problèmes de verrouillage mettant à jour le même enregistrement, je suppose. –

+0

Comme je sais que nous ne pouvons pas utiliser l'option 'AFTER INSERT' et mettre à jour le même enregistrement en utilisant le mot-clé 'NEW'. C'est le problème que j'ai. Est-il possible d'utiliser "AFTER INSERT" et de mettre à jour le même enregistrement? – nath

+3

Je ne pense pas qu'un déclencheur est la bonne façon de le faire. Pourquoi ne pas écrire un processus PL/SQL? –

Répondre

0

Je ne sais pas pourquoi vous utilisez transaction autonome ici et pourquoi avez-vous engager/rollback dans le déclencheur ...

+0

Dans la fonction PL/SQL, il existe plusieurs transactions de données entre les tables. Je dois donc m'assurer que le transfert de données a lieu sans problème. S'il y a un échec, j'ai besoin d'annuler tout le processus. Mais besoin de garder l'enregistrement qui déclenche le déclencheur et mettre à jour le statut comme 'FAILED' – nath

+5

Puis effectuez d'abord le 'INSERT', appelez la fonction PL/SQL. S'il y a un échec alors rollback, suivi par un autre 'INSERT' marqué comme FAILED. Les déclencheurs sont semi-diaboliques, les transactions autonomes sont semi-diaboliques. Les combiner est complètement mauvais! –

0

Est-ce le faire?

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; 
/
Questions connexes