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