SQL , V5R20 admet maintenant les fonctions définies par l'utilisateur [UDF] de type TABLE utilisable par SELECT * FROM TABLE (nom-fonction() ) AS alias une fonction est un programme ou une procédure dans un programme de service enregistré(e) dans les catalogues SQL par CREATE FUNCTION. par exemple : CREATE FUNCTION AF4TEST/TBLIBL ( ) RETURNS TABLE (BIB CHAR(10) , TEXT CHAR(50) ) EXTERNAL NAME 'AF4TEST/TBLIBL (1) PARAMETER STYLE DB2SQL (2) DISALLOW PARALLEL ; (3) (1) fait référence à DT8_CHAR8 dans DT_SQL (2) le passage de paramètres se fait avec les paramètres qui suivent. (3) DISALLOW PARRALLEL est obligatoire pour une fonction table |
détail de la syntaxe : (1) external name : a/ bib/nom ==> *PGM b/ bib/nom(fonction) ==> fonction dans un *SRVPGM (2) type de paramètres - DB2SQL convient pour les fonctions TABLE 1/ paramètres recus (x fois) 2/ val. retour en tant que paramètre en E/S 3/ indicateurs (binaire) pour val nulle de a1. 4/ indicateur (binaire) pour val. nulle de a2. 5/ SQLSTATE '00000' = fonction terminée sans erreur '01Hxx' = Warning (xx n'importe pas) |
'02000' = Fin de fichier : Obligatoire ! '38Ixx'à '38Zxx'= fonction terminée en erreur ==> génère SQLCODe négatif 6/ nom qualifié de la fonction (139 car.) 7/ nom complet, non qualifié (128 car.) 8/ message de diagnostique (VARCHAR) 9/ scratchpad = zone de dialogue , conservé entre deux appels UNIQUEMENT AVEC L'OPTION SCRATCHPAD 10/ type d'appel -1= premier , 1 =dernier 0 = autre -2 = phase d'initiation 2 = phase de terminaison -2 et 2 UNIQUEMENT AVEC L'OPTION CALL FINAL 11/ dbinfo (voir sqludf dans QSYSINC/H) UNIQUEMENT AVEC L'OPTION DBINFO |
voici le source RPG de la procédure associée à la fonction vue au début : ********************************************************************** * retourne *LIBL en tant que table * ********************************************************************** *paramètres D bib s 10 D texte s 50 *indicateurs SQL D bib_ind s 5I 0 D texte_ind s 5I 0 *divers SQL D SQLSTATE s 5 D fonction_qual s 139 varying D fonction_nom s 128 varying D msg_diag s 70 varying D call_type s 5I 0 * autres variables de travail D libl DS D unposte 11 dim(250) D unebib 10 overlay(unposte) D unblanc 1 overlay(unposte:*next) |
D i s 10I 0 D max s 10I 0 * pgm appellés DTBLIBL1 PR EXTPGM('AF4SRCT/TBLIBL1') D 2750 DTBLIBL2 PR EXTPGM('AF4SRCT/TBLIBL2') D 10 D 50 C *entry plist C parm bib C parm texte C parm bib_ind C parm texte_ind C parm sqlstate C parm fonction_qual C parm fonction_nom C parm msg_diag C parm call_type * début du code |
/free if call_type < 0 ; SQLSTATE = '00000' ; TBLIBL1(libl) ; // CL qui retourne *libl par RTVJOBA max = %lookup(*blanks : unebib) - 1 ; if max < 1 ; max = 250 ; endif ; return ; elseif call_type = 0 ; I = I + 1 ; if I > max ; SQLSTATE = '02000' ; *inlr = *on ; else ; bib = unebib(i) ; TBLIBL2(bib : texte ) ;//CL qui retourne le texte endif ; return ; else ; *inlr = *on ; endif ; |
/end-free Utilisation : select * from TABLE( af4srct/tblibl() ) as lib Affichage des données Largeur des données . . : Première ligne à afficher . . Première colonne à afficher . ....+....1....+....2....+....3....+....4....+....5....+....6.. LIB LIBTEXT AF400 Autoformation AF400 - Module principal QGPL General Purpose Library QTEMP ******** Fin de données ******** mais aussi : select * from TABLE( af4srct/tblibl() ) as libl where libtext like '%AF400%' etc... |