SQL : UDF(fonctions utilisateur) de type TABLE

BoTTom |    Changer de couleur
 
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
 


|    Changer de couleur
 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)


|    Changer de couleur
                                 '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     


|    Changer de couleur
 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)


|    Changer de couleur
     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


|    Changer de couleur
      /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                                                ;


|    Changer de couleur
      /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...





©AF400