Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/08/2011, 15h48   #1
Futur Membre du Club
 
Inscription : juin 2009
Messages : 69
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 69
Points : 17
Points : 17
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 :
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 :
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 :
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%
SuperWaza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 22h14   #2
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
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)
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/08/2011, 07h55   #3
Futur Membre du Club
 
Inscription : juin 2009
Messages : 69
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 69
Points : 17
Points : 17
Bonjour Luc,
le fait de passer par une fonction est une question de standard chez nous

Je sèche
SuperWaza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 12h23   #4
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
Question :

Comment fais-tu pour exécuter la requête de création de la fonction ?
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 13h57   #5
Futur Membre du Club
 
Inscription : juin 2009
Messages : 69
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 69
Points : 17
Points : 17
Code :
1
2
3
 
RUN PROGRAM(DSNTEP2) PLAN(DSNTEP91) PARMS('/ALIGN(LHS) MIXED') -  
PARMS('SQLTERM(%)') -
SuperWaza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 19h22   #6
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
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 :
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 %
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 11h53   #7
Futur Membre du Club
 
Inscription : juin 2009
Messages : 69
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 69
Points : 17
Points : 17
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
SuperWaza est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h25.


 
 
 
 
Partenaires

Hébergement Web