IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

PL/SQL: gestion des exceptions


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    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 : 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;
    Voici 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
    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

  2. #2
    Membre éclairé

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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;

  3. #3
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Par défaut
    Pour info :

    je crois que le fait de lire la variable sqlcode, la réinitialise.
    alors je suis d'accord avec sygale.
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    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.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Par défaut
    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" !!

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PL/SQL gestion des exceptions
    Par ensemien dans le forum PL/SQL
    Réponses: 2
    Dernier message: 10/09/2014, 00h11
  2. [11gR2] Gestion des exceptions/erreurs en PL/SQL
    Par devkais dans le forum PL/SQL
    Réponses: 2
    Dernier message: 05/12/2013, 14h02
  3. Gestion des exceptions dans sql*loader
    Par sabdoul dans le forum SQL*Loader
    Réponses: 0
    Dernier message: 06/03/2013, 13h00
  4. [PL/SQL] gestion des exceptions - probleme
    Par etoileDesNeiges dans le forum Administration
    Réponses: 6
    Dernier message: 11/01/2007, 17h13
  5. [EXCEPTION] Gestion des Exceptions dans PL/SQL
    Par Titouf dans le forum PL/SQL
    Réponses: 4
    Dernier message: 08/02/2006, 00h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo