IBM Books

Extension XML Administration et programmation

Composition du document XML

L'Extension XML comporte deux procédures mémorisées, dxxGenXML() et dxxRetrieveXML(), pour composer des documents XML.

dxxGenXML()
Cette procédure mémorisée est utilisée pour les applications qui exécutent des mises à jour occasionnelles ou qui ne veulent pas se charger de l'administration des données XML. Elle ne nécessite pas l'activation d'une collection, mais a recours à un fichier DAD.

Elle construit des documents XML à partir des tables de collection XML indiquées par l'élément <Xcollection> dans le fichier DAD. Cette procédure mémorisée insère chaque document XML sous forme de ligne dans une table de résultats. Vous pouvez également ouvrir un curseur dans la table de résultats et extraire l'ensemble de résultats. La table de résultats, qui doit toujours être créée par l'application, comporte une seule colonne de type VARCHAR, CLOB, XMLVARCHAR ou XMLCLOB. En outre, si vous attribuez la valeur YES à l'élément de validation figurant dans le fichier DAD, l'Extension XML ajoute la colonne DXX_VALID de type INTEGER et insère la valeur 1 ou 0, selon que le document XML est valide ou non.

La procédure mémorisée dxxGenXML() permet également de préciser le nombre maximal de lignes à générer dans la table de résultats dans le but de réduire les temps de traitement. Elle renvoie le nombre réel de ligne composant la table, ainsi que des codes et messages retour.

La procédure de décomposition correspondante est dxxShredXML(). Cette dernière utilise également la DAD comme paramètre d'entrée et ne nécessite pas l'activation d'une collection XML.

Pour composer une collection XML : dxxGenXML()

Imbriquez un appel de procédure mémorisée dans votre application par la déclaration suivante :

dxxGenXML(CLOB(100K)     DAD,             /* input */
               char(UDB_SIZE) resultTabName,   /* input */
               integer        overrideType,    /* input */
               varchar(1024)  override,        /* input */
               integer        maxRows,         /* input */
               integer        numRows,         /* output */
             long           returnCode,       /* output */
             varchar(1024)  returnMsg)        /* output */

Pour consulter la syntaxe complète et des exemples, reportez-vous à la section dxxGenXML().

Exemple : L'exemple ci-après illustre la composition d'un document XML :

#include "dxx.h"
#include "dxxrc.h"
 
EXEC SQL INCLUDE SQLCA;
 
EXEC SQL BEGIN DECLARE SECTION;
     SQL TYPE is CLOB(100K) dad;              /* DAD */
     SQL TYPE is CLOB_FILE  dadFile;          /* dad file */
         char    result_tab[32];  /* name of the result table */
              char    override[2];      /* override, will set to NULL*/
              short   overrideType;     /* defined in dxx.h */
         short   max_row;         /* maximum number of rows */
         short   num_row;         /* actual number of rows */
         long    returnCode;      /* return error code */
         char                  returnMsg[1024];  /* error message text */
         short                 dad_ind;
         short   rtab_ind;
         short   ovtype_ind;
         short   ov_inde;
         short   maxrow_ind;
         short   numrow_ind;
         short                 returnCode_ind;
         short                 returnMsg_ind;
 
  EXEC SQL END DECLARE SECTION;
              
         /* create table */
         EXEC CREATE TABLE xml_order_tab (xmlorder XMLVarchar);
 
     /* read data from a file to a CLOB */
     strcpy(dadfile.name,"c:\dxx\samples\dad\getstart_xcollection.dad");
     dadfile.name_length = strlen("c:\dxx\samples\dad\getstart_xcollection.dad");
     dadfile.file_options = SQL_FILE_READ;
     EXEC SQL VALUES (:dadfile) INTO :dad;
         strcpy(result_tab,"xml_order_tab");
     override[0] = '\0';
     overrideType = NO_OVERRIDE;
         max_row = 500;
         num_row = 0;
         returnCode = 0;
         msg_txt[0] = '\0';
         collection_ind = 0;
        dad_ind = 0;
         rtab_ind = 0;
     ov_ind = -1;
         ovtype_ind = 0;
         maxrow_ind = 0;
         numrow_ind = -1;
         returnCode_ind = -1;
         returnMsg_ind = -1;
 
         /* Call the store procedure */
     EXEC SQL CALL dxxGenXML(:dad:dad_ind;
                :result_tab:rtab_ind,
          :overrideType:ovtype_ind,:override:ov_ind,
                :max_row:maxrow_ind,:num_row:numrow_ind,
                      :returnCode:returnCode_ind,:returnMsg:returnMsg_ind); 

Une fois la procédure mémorisée appelée, la table de résultats contient 250 lignes car la requête SQL indiquée dans le fichier DAD a généré 250 documents XML.

dxxRetrieveXML()
Cette procédure mémorisée est utilisée pour les applications qui exécutent des mises à jour régulières. En raison de la répétition des mêmes tâches, il est important d'optimiser les performances. C'est ce que permet l'activation d'une collection XML et l'utilisation de son nom dans la procédure mémorisée.

La procédure mémorisée dxxRetrieveXML() fonctionne comme dxxGenXML(), excepté qu'elle utilise une collection XML activée, et non un fichier DAD. Lorsqu'une collection XML est activée, un fichier DAD est stocké dans la table XML_USAGE. L'Extension XML récupère le fichier DAD puis, à partir de cette action, dxxRetrieveXML() se comporte comme dxxGenXML().

dxxRetrieveXML() permet d'utiliser le même fichier DAD pour les opérations de composition et de décomposition. Cette procédure mémorisée permet également de récupérer des documents XML décomposés.

La procédure de décomposition correspondante est dxxInsertXML(). Cette dernière utilise également une collection XML activée.

Pour composer une collection XML : dxxRetrieveXML()

Imbriquez un appel de procédure mémorisée dans votre application par la déclaration suivante :

dxxRetrieveXML(char(UDB_SIZE) collectionName,  /* input */
               char(UDB_SIZE) resultTabName,   /* input */
               integer        overrideType,    /* input */
               varchar(1024)  override,        /* input */
               integer        maxRows,         /* input */
               integer        numRows,         /* output */
             long           returnCode,       /* output */
             varchar(1024)  returnMsg)        /* output */

Pour consulter la syntaxe complète et des exemples, reportez-vous à la section dxxRetrieveXML().

Exemple : Voici un exemple d'appel de la procédure dxxRetrieveXML(). Soit une table de résultats XML_ORDER_TAB, contenant une colonne de type XMLVARCHAR.

#include "dxx.h"
#include "dxxrc.h"
 
EXEC SQL INCLUDE SQLCA;
 
EXEC SQL BEGIN DECLARE SECTION;
         char    collection[32];  /* dad buffer */
         char    result_tab[32];  /* name of the result table */
              char    override[2];      /* override, will set to NULL*/
              short   overrideType;     /* defined in dxx.h */
         short   max_row;         /* maximum number of rows */
         short   num_row;         /* actual number of rows */
         long    returnCode;      /* return error code */
         char                  returnMsg[1024];  /* error message text */
         short   dadbuf_ind;
         short   rtab_ind;
         short   ovtype_ind;
         short   ov_inde;
         short   maxrow_ind;
         short   numrow_ind;
         short                 returnCode_ind;
         short                 returnMsg_ind;
 
  EXEC SQL END DECLARE SECTION;
              
         /* create table */
              EXEC SQL CREATE TABLE xml_order_tab (xmlorder XMLVarchar);
 
         /* initialize host variable and indicators */
         strcpy(collection,"sales_ord");
         strcpy(result_tab,"xml_order_tab");
     override[0] = '\0';
     overrideType = NO_OVERRIDE;
         max_row = 500;
         num_row = 0;
         returnCode = 0;
         msg_txt[0] = '\0';
         collection_ind = 0;
         rtab_ind = 0;
     ov_ind = -1;
         ovtype_ind = 0;
         maxrow_ind = 0;
         numrow_ind = -1;
         returnCode_ind = -1;
         returnMsg_ind = -1;
 
         /* Call the store procedure */
         EXEC SQL CALL dxxRetrieve(:collection:collection_ind;
                :result_tab:rtab_ind,
          :overrideType:ovtype_ind,:override:ov_ind,
                :max_row:maxrow_ind,:num_row:numrow_ind,
                      :returnCode:returnCode_ind,:returnMsg:returnMsg_ind);


[ Début de page | Page précédente | Page suivante | Table des matières | Index ]