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

DB2 Discussion :

DB2 Z/OS 9.1 - User Defined Fonction


Sujet :

DB2

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Points : 49
    Points
    49
    Par défaut DB2 Z/OS 9.1 - User Defined Fonction
    Bonjour,
    j'ai un problème avec une UDF (User Defined Fonction) ...

    J'ai créé une table "GLOBAL TEMPORARY TABLE" ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE GLOBAL TEMPORARY TABLE NS_ID_TAB   
    (NS_ID  INTEGER NOT NULL) ;
    Maintenant, je voudrais définir une UDF qui va me remplir cette table ...
    J'ai donc un string en input séparé par des , (AI_NS_ID_STR VARCHAR (4000)) que je veux parser / spliter dans la table temporaire ... mais j'ai un soucis lors de la définition de cette UDF ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SQLCODE = -199, ERROR:  ILLEGAL USE OF KEYWORD DECLARE.  TOKEN <END-OF-STATEMENT> SPECIFIC FENCED RETURN SOURCE
    PARAMETER WAS EXPECTED
    Avez-vous une idée sur le pourquoi ?

    Voici le code de l'UDF ...

    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
     
    CREATE FUNCTION TOTO.PARSING ( AI_NS_ID_STR VARCHAR (4000) )           
    RETURNS                                                                
    LANGUAGE SQL                                                           
    MODIFIES SQL DATA                                                      
    EXTERNAL ACTION                                                        
     
    DECLARE I_STT   INTEGER ;                                              
    DECLARE I_LGT   INTEGER ;                                              
    DECLARE I_CMA   INTEGER ;                                              
    DECLARE L_NS_ID INTEGER ;                                              
     
     SET I_STT  = 1;                                                       
     SET I_LGT  = LENGTH(AI_NS_ID_STR);                                    
     SET I_CMA  = LOCATE(',',AI_NS_ID_STR,I_STT);                          
     
     WHILE I_CMA > 0 DO    
     
      SET L_NS_ID = INT(SUBSTR(AI_NS_ID_STR,I_STT,I_CMA - I_STT));         
     
      INSERT INTO TOTO.NS_ID_TAB (NS_ID) VALUES (L_NS_ID);                 
     
      SET I_STT = I_CMA + 2;                                               
      SET I_CMA = LOCATE(',',AI_NS_ID_STR,I_STT);                       
     
     END WHILE;                                                            
     
     SET L_NS_ID  = INT(SUBSTR(AI_NS_ID_STR,I_STT,I_LGT - I_STT + 1));     
     
     INSERT INTO TOTO.NS_ID_TAB (NS_ID) VALUES (L_NS_ID)%                  
     
    RETURN 1%

  2. #2
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Une idée comme ça ... attention ce n'est qu'une suggestion ...

    Plutôt qu'une function ne serait-ce pas plutôt une stored procedure qu'il faudrait définir ?

    Et même une SQL native procedure apparue récemment (en V9 je crois) ?

    Autre piste : il peut y avoir conflit entre le séparateur d'instructions au sein de la procédure elle-même et le séparateur d'ordres SQL utilisé par l'outil d'analyse et d'exécution des requêtes ... Cas typique avec DSTEP2 ou DSNTEP4 ... D'où l'utilisation du paramètre SQLTERM(termchar)

  3. #3
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Points : 49
    Points
    49
    Par défaut
    Bonjour Luc,
    le fait de passer par une fonction est une question de standard chez nous

    Je sèche

  4. #4
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Question :

    Comment fais-tu pour exécuter la requête de création de la fonction ?

  5. #5
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Points : 49
    Points
    49
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RUN PROGRAM(DSNTEP2) PLAN(DSNTEP91) PARMS('/ALIGN(LHS) MIXED') -  
    PARMS('SQLTERM(%)') -

  6. #6
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    En passant en procedure ça compile en code 0 ...

    J'ai mis les accès aux tables en commentaire pour ne pas devoir les créer chez moi ...

    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
    CREATE PROCEDURE PARSING ( IN AI_NS_ID_STR VARCHAR (4000) )
    VERSION V1
    LANGUAGE SQL
    MODIFIES SQL DATA
    P1: BEGIN
          DECLARE I_STT   INTEGER DEFAULT NULL ;
          DECLARE I_LGT   INTEGER DEFAULT NULL ;
          DECLARE I_CMA   INTEGER DEFAULT NULL ;
          DECLARE L_NS_ID INTEGER DEFAULT NULL ;
    SET I_STT  = 1;
    SET I_LGT  = LENGTH(AI_NS_ID_STR);
    SET I_CMA  = LOCATE(',',AI_NS_ID_STR,I_STT);
    WHILE I_CMA > 0 DO
     SET L_NS_ID = INT(SUBSTR(AI_NS_ID_STR,I_STT,I_CMA - I_STT));
    -INSERT INTO TOTO.NS_ID_TAB (NS_ID) VALUES (L_NS_ID);
     SET I_STT = I_CMA + 2;
     SET I_CMA = LOCATE(',',AI_NS_ID_STR,I_STT);
    END WHILE;
     SET L_NS_ID  = INT(SUBSTR(AI_NS_ID_STR,I_STT,I_LGT - I_STT + 1));
    -INSERT INTO TOTO.NS_ID_TAB (NS_ID) VALUES (L_NS_ID)%
    END P1 %

  7. #7
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Points : 49
    Points
    49
    Par défaut
    Bonjour Luc,
    je vais donc utiliser une SP au lieu d'une UDF mais une SP peut-elle appeler une autre SP ?

    Et surtout récupérer les valeurs stockées dans une CREATE GLOBAL TEMPORARY TABLE ... normalement oui avec l'option COMMIT ON RETURN NO

Discussions similaires

  1. [XL-2007] VBA: user defined type et prodécures/fonctions dans le code d'un onglet
    Par joker.benj dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/03/2011, 10h20
  2. [VB]user defined type undefined???
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 13/02/2006, 14h36
  3. User Defined Function (UDF)
    Par mondelphi dans le forum SQL
    Réponses: 3
    Dernier message: 22/04/2005, 10h22
  4. INSO Filter : "USER-defined exception" avec ctx_do
    Par Wiztiti dans le forum Oracle
    Réponses: 2
    Dernier message: 01/06/2004, 16h14
  5. USER DEFINE FONCTION : PB éxécution requête
    Par juelo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/01/2004, 11h12

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