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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Partager