PL/SQL: gestion des exceptions
Bonjour,
voilà j'ai un ordre SELECT tout simple dans la procedure suivante qui fait pas ce que j'attends
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 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; |
Voici la log et en bleu, par où passe mon code pour trois "DI Name" en particulier ...
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
| 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 |
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 ...
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