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

SQL Oracle Discussion :

Traitement commun à toutes les exceptions


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut Traitement commun à toutes les exceptions
    Bonjour !

    J'ai à la fin de ma fonction PL tout un tas de traitements propres à chaque exception (principalement ecriture d'un message différent dans chaque cas dans un fichier de log)

    J'aimerais réaliser pour toute ou partie des exception un traitement commun. J'aurais donc aimé savoir s'il existait une instruction qui permette de réaliser un traitement après les 'when', peu importe lequel ait été choisi.

    J'ai pensé mettre ce traitement commun dans une fonction mais il y a enormement d'arguments à passer donc je voudrais savoir si de meilleures solutions existent.

    On m'a évoqué une solution visant à ne mettre qu'une seule exception WHEN OTHERS, qui contiendrait elle-même un case qui gèrerait ensuite chaque exception, dans ce style :
    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
    EXCEPTION 
     
           WHEN OTHERS                      THEN 
                BEGIN
                    -- Vidage tables d'import (il faut désactiver les foreign keys sinon on obtient une erreur)
                     EXECUTE IMMEDIATE 'ALTER TABLE IMPORT_TITRE_DIFFUSION
                                        disable CONSTRAINT FK_IMPORT_TIT_DIFF_IMPORT_DIFF';
                     EXECUTE IMMEDIATE 'TRUNCATE TABLE IMPORT_TITRE_DIFFUSION';
                     EXECUTE IMMEDIATE 'TRUNCATE TABLE IMPORT_DIFFUSION';
                     EXECUTE IMMEDIATE 'ALTER TABLE IMPORT_TITRE_DIFFUSION
                                        enable CONSTRAINT FK_IMPORT_TIT_DIFF_IMPORT_DIFF';
     
                     CASE Exception
                         WHEN UTL_FILE.INVALID_FILEHANDLE THEN 
                            --BEGIN
                                 -- log
                                 ps_log ( 'Erreur import Diffusion : UTL_FILE.INVALID_FILEHANDLE', l_s_repFicLogOut, l_s_logFic, 2 );
                            --END;
     
                         WHEN UTL_FILE.INVALID_OPERATION  THEN 
                              --BEGIN
                                   -- log
                                   ps_log ( 'Erreur import Diffusion : UTL_FILE.INVALID_OPERATION', l_s_repFicLogOut, l_s_logFic, 2 );
                              --END;
     
                         WHEN UTL_FILE.READ_ERROR         THEN 
                              --BEGIN
                                   -- log
                                   ps_log ( 'Erreur import Diffusion : UTL_FILE.READ_ERROR', l_s_repFicLogOut, l_s_logFic, 2 );
                              --END;
     
                         WHEN UTL_FILE.INVALID_PATH       THEN 
                              --BEGIN
                                   -- log
                                   ps_log ( 'Erreur import Diffusion : UTL_FILE.INVALID_PATH', l_s_repFicLogOut, l_s_logFic, 2 );
                              --END;
     
                         WHEN UTL_FILE.INVALID_MODE       THEN 
                              --BEGIN
                                   -- log
                                   ps_log ( 'Erreur import Diffusion : UTL_FILE.INVALID_MODE', l_s_repFicLogOut, l_s_logFic, 2 );
                              --END;
     
                         WHEN NO_DATA_FOUND               THEN 
                              BEGIN
                                   -- log
                                   ps_log ( 'Erreur import Diffusion : NO_DATA_FOUND', l_s_repFicLogOut, l_s_logFic, 2 );
                                   -- fermeture du fichier
                                   UTL_FILE.FCLOSE ( l_f_ficPrep );
                                   -- destruction des directorys
                                   l_n_rtnFct := PK_UTILITAIRES.fn_dropDirectory ( l_s_repFicIn );
                                   l_n_rtnFct := PK_UTILITAIRES.fn_dropDirectory ( l_s_repFicLogOut );
                              END;
     
                         ELSE     
                              -- log
                              ps_log ( 'Erreur import Diffusion : Autres', l_s_repFicLogOut, l_s_logFic, 2 );    
     
                     END CASE;        
     
                END;
    mais je ne sais pas comment récupérer l'intitulé de chaque exception, ou un code, 'à la mano'

    Auriez vous une idée de solution ?

    Merci à vous
    David

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    pour ta fonction avec plein de paramètres, tu peux déjà créer un package avec les variables en question et la fameuse fonction sans paramètre. Cette fonction utilisera les variables du package que tu aura pris soin de valoriser dans le code.

    Sinon, j'ai pas trop d'idée... si le WHEN avec les CASE fonctionne alors en effet c'est une solution sympa bien que ça me paraisse un peu lourd

  3. #3
    Membre averti
    Inscrit en
    Août 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 20
    Par défaut
    Le case when dans le traitement des exceptions semble une bonne idée.

    Derrière le WHEN OTHERS tu lances ta fonction commune (packagée ou non) puis dans le CASE WHEN tu traites chaque exception.

    Si ta fonction accepte des valeurs de paramètres différentes selon l'exception rencontrée tu lances d'abord le case when avec initialisation de valeurs et ensuite la fonction commune.

  4. #4
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut
    Oui c'est une solution que j'ai envisagé, mais comment peut récupérer l'intitulé ou le code de l'exception une fois passé dans le 'WHEN OTHERS' ? En d'autre termes que dois-je mettre derrière le 'case' ?

  5. #5
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    pourquoi ne pas tout simplement valoriser une variable GV$EXCEPTION_NAME (avec nodatafound, ukviolation, etc...) qui sera utiliser dans ta fonction commune ?

  6. #6
    Membre averti
    Inscrit en
    Août 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 20
    Par défaut
    Il faut savoir quel type d'exception tu veux traiter en particulier ou veux-tu simplement afficher l'erreur ORACLE RENCONTREE.

    Tu as bien la variable SQLCODE qui contient le code de la dernière erreur ou mieux SQLERRM(SQLCODE) permettant de récupérer le message ORACLE complet.

    Ensuite à toi de savoir ce que tu veux lancer en cas de NO_DATA_FOUND, TOO_MANY_ROWS, DUP_VAL_ON_INDEX etc.

    Dans le cas de l'utilisation des UTL_FILE je sais que tu peux avoir un code retour du type 'Oracle non exception'.
    Je sais aussi que ça peux se traiter mais il faut que je fasse des recherches

  7. #7
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut
    Citation Envoyé par orafrance Voir le message
    pourquoi ne pas tout simplement valoriser une variable GV$EXCEPTION_NAME (avec nodatafound, ukviolation, etc...) qui sera utiliser dans ta fonction commune ?
    Citation Envoyé par Phil_67 Voir le message
    Tu as bien la variable SQLCODE qui contient le code de la dernière erreur ou mieux SQLERRM(SQLCODE) permettant de récupérer le message ORACLE complet.
    Ce que je cherche c'est effectivement peupler une variable que j'utiliserai dans mon case et qui contiendrait (idéalement) des chaînes comme UTL_FILE.INVALID_FILEHANDLE, UTL_FILE.INVALID_OPERATION, UTL_FILE.READ_ERROR, UTL_FILE.INVALID_PATH, UTL_FILE.INVALID_MODE ou NO_DATA_FOUND
    pour se référer a l'exemple de code que je vous ai donné plus haut

    Est ce que c'est bien ce que renvoie SQLERRM(SQLCODE) ?

    J'aurai pu le faire au moment du RAISE mais je ne les fait pas tous manuellement, vous vous en doutez bien

  8. #8
    Membre averti
    Inscrit en
    Août 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 20
    Par défaut
    Le SQLCODE contient le code ORACLE de ton exception :
    ex.: en cas de no_data_found le
    SQLERRM(SQLCODE) = 'ORA-01403: aucune donnée trouvée'

    quant au SQLCODE il contient un numéro d'erreur ici SQLCODE= 100

    Si tu peux récupérer les différents identifiants = numéros des exceptions que tu veux traiter tu peux dans ton CASE WHEN mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    exception when others then
      begin
       case sqlcode
       when 100  then
         -- traitement du NO_DATA_FOUND
       When x then
         -- traitement de l'erreur numéro x
       else
         -- traitement de toutes les autres exceptions 
       end case;
      end;
    end;

Discussions similaires

  1. Traitement de toutes les exceptions
    Par moooona dans le forum C++
    Réponses: 7
    Dernier message: 16/06/2011, 17h41
  2. Capturer toutes les exceptions
    Par schneidb dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 13/02/2007, 14h51
  3. [VB.net] MsgBox pour toutes les exceptions
    Par collaud_vb dans le forum Windows Forms
    Réponses: 5
    Dernier message: 06/10/2006, 21h56
  4. [Exceptions]Attraper toutes les exceptions
    Par willowII dans le forum Langage
    Réponses: 4
    Dernier message: 16/08/2006, 19h41
  5. Réponses: 6
    Dernier message: 06/10/2004, 10h41

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