Bonjour à tous,

J'ai une question, mais je ne sais pas s'il reste encore beaucoup de personnes qui utilisent encore ce langage.

J'explique mon problème. dans un batch en Pro*C j'ai une méthode qui fait un update de 7 champs d'une table. La valeur que je veux mettre pour ces 7 champs est le résultat de plusieurs DECODE. Et c'est exactement le même traitement pour les 7 champs.
La valeur que je veux affecter est de la forme :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
DECODE( NVL(code_a_changer ,'#'), '#' , :CodNull
			, '999997', code_a_changer 
			, '999998', code_a_changer 
			, '999999', code_a_changer 
			, DECODE( SUBSTR(code_a_changer ,1,2), '03'
				, SUBSTR(code_a_changer ,1,2) || '000' || SUBSTR(code_a_changer ,6,1)
				, SUBSTR(code_a_changer ,1,4) || '0' || SUBSTR(code_a_changer ,6,1)
				)
      )

Et ma méthode est comme ça :

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
70
71
72
73
74
static void ma_methode ( void )
{
    EXEC SQL EXECUTE
         BEGIN
            UPDATE ma_table 
               SET champ1 =  DECODE( NVL(champ1 ,'#'), '#' , :ach_O_CodNull
                                                                , '999997', champ1
                                                                , '999998', champ1
                                                                , '999999', champ1
                                                                , DECODE( SUBSTR(champ1,1,2), '03'
                                                                        , SUBSTR(champ1,1,2) || '000' || SUBSTR(champ1,6,1)
                                                                        , SUBSTR(champ1,1,4) || '0' || SUBSTR(champ1,6,1)
                                                                        )
                                              )  
                   ,champ2 = DECODE( NVL(champ2 ,'#'), '#' , :ach_O_CodNull
                                                                , '999997', champ2
                                                                , '999998', champ2
                                                                , '999999', champ2
                                                                , DECODE( SUBSTR(champ2,1,2), '03'
                                                                        , SUBSTR(champ2,1,2) || '000' || SUBSTR(champ2,6,1)
                                                                        , SUBSTR(champ2,1,4) || '0' || SUBSTR(champ2,6,1)
                                                                        )
                                              ) 
                   ,champ3  = DECODE( NVL(champ3 ,'#'), '#' , :ach_O_CodNull
                                                                , '999997', champ3
                                                                , '999998', champ3
                                                                , '999999', champ3
                                                                , DECODE( SUBSTR(champ3,1,2), '03'
                                                                        , SUBSTR(champ3,1,2) || '000' || SUBSTR(champ3,6,1)
                                                                        , SUBSTR(champ3,1,4) || '0' || SUBSTR(champ3,6,1)
                                                                        )
                                              )  
                  ,champ4 =   DECODE( NVL(champ4 ,'#'), '#' , :ach_O_CodNull
                                                                , '999997', champ4
                                                                , '999998', champ4
                                                                , '999999', champ4
                                                                , DECODE( SUBSTR(champ4,1,2), '03'
                                                                        , SUBSTR(champ4,1,2) || '000' || SUBSTR(champ4,6,1)
                                                                        , SUBSTR(champ4,1,4) || '0' || SUBSTR(champ4,6,1)
                                                                        )
                                          ) 
                   ,champ5 = DECODE( NVL(champ5,'#'), '#'     , :ach_O_CodNull
                                                                , '999997', champ5
                                                                , '999998', champ5
                                                                , '999999', champ5
                                                                , DECODE( SUBSTR(champ5,1,2), '03'
                                                                        , SUBSTR(champ5,1,2) || '000' || SUBSTR(champ5,6,1)
                                                                        , SUBSTR(champ5,1,4) || '0' || SUBSTR(champ5,6,1)
                                                                        )
                                              ) 
                   ,champ6 = DECODE( NVL(champ6,'#'), '#'     , :ach_O_CodNull
                                                                , '999997', champ6
                                                                , '999998', champ6
                                                                , '999999', champ6
                                                                , DECODE( SUBSTR(champ6,1,2), '03'
                                                                        , SUBSTR(champ6,1,2) || '000' || SUBSTR(champ6,6,1)
                                                                        , SUBSTR(champ6,1,4) || '0' || SUBSTR(champ6,6,1)
                                                                        )
                                              ) 
                   ,champ7 = DECODE( NVL(champ7,'#'), '#'     , :ach_O_CodNull 
                                                                , '999997', champ7
                                                                , '999998', champ7
                                                                , '999999', champ7
                                                                , DECODE( SUBSTR(champ7,1,2), '03'
                                                                        , SUBSTR(champ7,1,2) || '000' || SUBSTR(champ7,6,1)
                                                                        , SUBSTR(champ7,1,4) || '0' || SUBSTR(champ7,6,1)
                                                                        )
                                              ) ;    

            COMMIT;
         END;

   END-EXEC;    
}
Et j'en arrive à ma question. Je souhaiterais essayer de factoriser mon code en créant une fonction pour laquelle je lui rentre le code, et elle me ressort le code modifié.
Et bien sûr une fonction que je puisse utiliser dans les affectations de mon update...
Est-ce possible ? et si oui, comment ?
Si vous avez une solution, ce serait génial.

Michel