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

  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;

  9. #9
    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
    ok... Il faut que je trouve la correspondance alors... Je finis ce que je fais et j'étudie la chose. Je crois que si je commence à mettre des codes partout ça va pas le faire niveau maintenabilité.

    A voir... Merci beaucoup à vous en tout cas pour votre précieuse aide

  10. #10
    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
    enfin là tu réinventes les exceptions standards d'Oracle

  11. #11
    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
    Même pas peur :p

    Non je crois que je vais éviter de tout réinventer et me contenter plutôt de faire une fonction fusse-t-elle compliquée et infligée d'une palanquée d'arguments...

  12. #12
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Par défaut
    Le Exception when est déjà un case, il n'est pas utile de le traiter avec un autre case.
    il vaut mieux quelque chose du genre :
    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
     
    EXCEPTION
     WHEN UTL_FILE.INVALID_FILEHANDLE THEN 
        BEGIN
           l_errror := 'INVALID_FILEHANDLE';
           ps_err ( l_error, l_s_repFicLogOut, l_s_logFic, 2 );
        END;
     WHEN UTL_FILE.INVALID_OPERATION  THEN 
        BEGIN
           l_errror := 'INVALID_OPERATION';
           ps_err ( l_error, l_s_repFicLogOut, l_s_logFic, 2 );
        END;
     WHEN ...
     WHEN OTHERS THEN
        BEGIN
           l_errror := SQLERRM; -- ou SQLCODE
           ps_err ( l_error, l_s_repFicLogOut, l_s_logFic, 2 );
        END;
    ps_err effectue la purge de la table et renseigne le log

  13. #13
    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
    Merci de lire la totalité des posts avant de les sortir du fin fond des abysses. La question était ici comment réaliser un traitement commun à toutes les erreurs.

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