Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/02/2007, 18h24   #1
Invité de passage
 
Inscription : février 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 3
Points : 1
Points : 1
Par défaut 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
elpibe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 18h52   #2
Membre éclairé
 
Inscription : septembre 2003
Messages : 432
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 432
Points : 326
Points : 326
de mémoire ORACLE garde dans SQLCODE la dernière erreur donc si tu a eu une erreure elle reste donc ton test avec
Code :
1
2
3
4
5
 
IF sqlcode = 0 then 
   dbms_output.put_line('sbla <employeur a un autre role>');
[.....]
end IF;
sera jamais vrai car sqlcode=0 que si aucune erreur n'est relavée, donc tu peux supprimer tous tes if sqlcode = 0

tente ca cela devrait fonctionner sans pb
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
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';
 
		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;
 
		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');
 
				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;
 
				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;
sygale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 06h56   #3
Responsable Business Intelligence
 
Avatar de kalyparker
 
Femme
Consultant en Business Intelligence
Inscription : janvier 2007
Messages : 1 192
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : janvier 2007
Messages : 1 192
Points : 2 564
Points : 2 564
Pour info :

je crois que le fait de lire la variable sqlcode, la réinitialise.
alors je suis d'accord avec sygale.
kalyparker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 07h43   #4
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
2 SELECT INTO partent en ereur parce qu'ils ramène plus d'une ligne (TOO_MANY_ROWS). Vérifiez votre clause WHERE afin qu'elle ne ramène qu'une seule ligne, ou utilisez un curseur.
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 10h00   #5
Invité de passage
 
Inscription : février 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 3
Points : 1
Points : 1
Bonjour,
merci pour vos réponses ! Apparemment Oracle fonctionne différemment de DB2 pour l'ordre SQLCODE => je vais les enlever et je reviens vers vous pour, je l'espère, mettre la discussion à "résolue" !!
elpibe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 11h57   #6
Invité de passage
 
Inscription : février 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 3
Points : 1
Points : 1
Par défaut Resolu

Merci.
ce sont bien les tests IF SQLCODE=0 qui me jouaient des tours !
je pense qu'on peut les tester en le recuperant dans une variable et ensuite
tester la variable.
Encore merci pour tout.
elpibe est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h05.


 
 
 
 
Partenaires

Hébergement Web