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

Interfaces de programmation Oracle Discussion :

[Pro*C] Utilisation d'une fonction dans un bloc exec sql execute


Sujet :

Interfaces de programmation Oracle

  1. #1
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut [Pro*C] Utilisation d'une fonction dans un bloc exec sql execute
    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

  2. #2
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Bonjour à tous,

    Changement de méthode. la fonction, je l'ai intégrée dans un package de la base de données.

    Du coup, la partie Pro*C est plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	EXEC SQL EXECUTE 
             BEGIN
                UPDATE ma_table 
                   SET  champ1 = PACKAGE.MA_FONCTION(champ1)  
                       ,champ2 = PACKAGE.MA_FONCTION(champ2) 
                       ,champ3 = PACKAGE.MA_FONCTION(champ3)  
                       ,champ4 = PACKAGE.MA_FONCTION(champ4) 
                       ,champ5 = PACKAGE.MA_FONCTION(champ5) 
                       ,champ6 = PACKAGE.MA_FONCTION(champ6) 
                       ,champ7 = PACKAGE.MA_FONCTION(champ7) ;           
                COMMIT;
             END;
       END-EXEC;
    Par contre à la compilation j'ai un message d'erreur qui me dit :
    PLS-S-00302, component 'MA_FONCTION' must be declared
    Quelqu'un a une idée ?

    Merci

    Michel

  3. #3
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Salut à tous,

    Bon, j'ai trouvé mon erreur. Je compile mon batch sur un serveur dédié mais sur lequel je n'avais pas mis en place ma fonction dans la base de données. D'où le fait que la compilation ne trouvait pas la fonction..
    C'était logique.
    Du coup, même si je suis déçu de ne pas avoir pu tout faire dans mon script Pro*C, maintenant ça fonctionne impeccablement.

    Ce langage est vraiment pourri... mais c'est normal, mélanger le C qui est un langage pourri avec du code PL/SQL.... ça ne pouvait pas produire quelque chose de bien.

    Merci de m'avoir lu.

    A+

    Michel

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

Discussions similaires

  1. Bug lors de l'utilisation d'une fonction dans une macro.
    Par monf29 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/06/2007, 14h35
  2. [Syntaxe] utilisation d'une fonction dans mysql
    Par mussara dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 01/04/2007, 19h40
  3. utilisation d'une fonction dans un cham texte
    Par Mat_DZ dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 11/09/2006, 14h16
  4. Utilisation d'une variable dans un bloc pl/sql
    Par paris2000fr dans le forum PL/SQL
    Réponses: 2
    Dernier message: 29/03/2006, 14h08
  5. Utilisation d'une fonction dans une procedure
    Par MaxiMax dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/08/2005, 15h51

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