[ORACLE] : Gestion des transactions
Bonjour,
dans le cadre de mon projet, je rencontre quelques petits problèmes dans la gestion des transactions.
Une de mes procedure contient un curseur qui fait appel à une autre procedure
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| CREATE OR REPLACE procedure1(...)
AS
...
...
...
TYPE c_cursor IS REF CURSOR; -- Création d'un type CURSOR
cCurseur c_cursor;
...
...
...
BEGIN
...
...
...
OPEN cCurseur FOR vRequete;
LOOP
FETCH cCurseur INTO vTruc;
EXIT WHEN cCurseur %NOTFOUND;
-- On appelle une autre procedure
GEST_HARPEGE.P6PR_modifAffectation procedure2(...);
...
...
...
END LOOP;
CLOSE cCurseur ;
-- On valide les opérations en base de données
COMMIT;
EXCEPTION
WHEN OTHERS THEN
-- Arrêt de la procédure à la suite d'une erreur ORACLE
ROLLBACK;
END;
CREATE OR REPLACE procedure1(...)
AS
...
...
...
BEGIN
...
...
...
-- Ici on réalise le traitement.
-- Il n'y a pas de COMMIT. Le commit doit être réalisé par celui de la procedure1
...
...
...
EXCEPTION
WHEN OTHERS THEN
-- Arrêt de la procédure à la suite d'une erreur ORACLE
ROLLBACK;
END; |
Par le biais du curseur, la procedure1 apelle a plusieurs reprise le procedure2.
Dès qu'une anomalie apparaît dans la procedure2, il faut que la procedure1 s'arrête et qu'un ROLLBACK soit réalisé. En d'autres termes, on doit valider l'ensembles des opérations des procedure2 ou aucune.
Ce que je veux faire ne fonctionne pas. En effet si la procedure2 a été appelée 9 fois par la procedure1 et qu'une erreur se produit sur le 10ème appel, alors le traitement du 10ème appel subit un ROLLBACK (celui de la procedure2) mais les traitements des 9 autres sont validés dans la base de données.
Y-a-t-il un COMMIT implicite à la fin d'une procedure ? Ca me semblerait bizarre...
Est-ce que mon problème vient du fait que j'ai géré l'erreur dans le procedure2 par une EXCEPTION ?
Merci de votre aide et bonne journée.