Bonjour,
voilà j'ai un ordre SELECT tout simple dans la procedure suivante qui fait pas ce que j'attendsVoici la log et en bleu, par où passe mon code pour trois "DI Name" en particulier ...
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
62
63
64
65
66
67
68
69 DECLARE blabla dont CURS_PM... BEGIN OPEN CURS_PM; LOOP FETCH CURS_PM INTO v_row_id, v_name; EXIT WHEN CURS_PM%NOTFOUND; DBMS_OUTPUT.PUT_LINE('SBLA FETCH DI Name=<' || v_name || '>'); BEGIN SELECT C.OU_ID INTO v_bon_id FROM S_OPTY_ORG C WHERE C.OPTY_ID = v_row_id AND C.X_EMPLOYEUR = 'Oui'; IF SQLCODE = 0 THEN DBMS_OUTPUT.PUT_LINE('SBLA <sqlcode=0>'); UPDATE S_OPTY SET X_AG_PR_PM_EMPLOYEUR_ID = v_bon_id WHERE ROW_ID = v_row_id; n_cpt_upd := n_cpt_upd + 1; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('SBLA <sqlcode=100>'); UPDATE S_OPTY SET X_AG_PR_PM_EMPLOYEUR_ID = null WHERE ROW_ID = v_row_id; n_cpt_null := n_cpt_null + 1; WHEN TOO_MANY_ROWS THEN BEGIN -- ReLecture S_OPTY_ORG avec ajout de critères DBMS_OUTPUT.PUT_LINE('SBLA <TOO_MANY_ROWS>'); SELECT A.OU_ID INTO v_bon_id FROM S_OPTY_ORG A WHERE A.OPTY_ID = v_row_id AND A.X_EMPLOYEUR = 'Oui' AND (A.X_DESTINATAIRE = 'Oui' OR A.X_COFINANCEUR = 'Oui' OR A.X_CONTRACTANT = 'Oui' OR A.X_TUTEUR = 'Oui'OR A.X_EXPERT = 'Oui'); IF SQLCODE = 0 THEN DBMS_OUTPUT.PUT_LINE('SBLA <employeur a un autre role>'); UPDATE S_OPTY SET X_AG_PR_PM_EMPLOYEUR_ID = v_bon_id WHERE ROW_ID = v_row_id; n_cpt_upd := n_cpt_upd + 1; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('SBLA1 Employeur seul en double'); n_cpt_doub := n_cpt_doub + 1; WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('SBLA2 Employeur avec autre role en double'); n_cpt_doub := n_cpt_doub + 1; END; END; n_compteur := n_compteur + 1; --IF n_compteur > 50 THEN COMMIT; --END IF; END LOOP;
On pourrait penser qu'il fait deux UPDATE pour les NAME 66009909 et 66009909E1 mais mon compteur d'update en compte 17 au lieu de 19 et sous Toad je vois bien qu'il a pas fait les updates ...
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 Rattrapage Employeur PM1 - Debut a : 15/02/2007 17:29:42 SBLA FETCH DI Name=<66004452> SBLA <sqlcode=0> SBLA FETCH DI Name=<66007457> SBLA <sqlcode=0> SBLA FETCH DI Name=<66007457E1> SBLA <sqlcode=0> SBLA FETCH DI Name=<66007457T1> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009685> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009685E1> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009702> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009702E1> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009702T1> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009909> SBLA <TOO_MANY_ROWS> ??? SBLA FETCH DI Name=<66009909E1> SBLA <TOO_MANY_ROWS> ??? SBLA FETCH DI Name=<66009909T1> SBLA <TOO_MANY_ROWS> SBLA1 Employeur seul en double SBLA FETCH DI Name=<66009327> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009518> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009518S1> SBLA <sqlcode=0> SBLA FETCH DI Name=<66006307> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009092> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009093> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009091> SBLA <sqlcode=0> SBLA FETCH DI Name=<66009685T1> SBLA <sqlcode=0> Fin M.A.J. Employeur PM1 : Nb enreg = 20 Compteur.................. Nb update = 17 Compteur.................. Nb null = 0 Compteur.................. Nb doublon = 1 PL/SQL procedure successfully completed. Rattrapage Employeur PM1 - Fin a : 15/02/2007 17:29:43
Et A priori, on n'est pas passé par le 2e pavé EXCEPTION puisque j'ai rien dans la log !
Savez-vous ce qu'il se passe ? Ai-je un pb de syntaxe ?
MERCI DE VOTRE AIDE
Partager