IBM Books

Administración y programación


Descomposición de documentos XML en datos DB2

Descomponer un documento XML es desglosar los datos que contiene y almacenarlos en tablas relacionales. El XML Extender proporciona procedimientos almacenados para descomponer datos XML, procedentes de documentos XML fuente, en tablas relacionales. Para utilizar estos procedimientos almacenados debe crear un archivo DAD, el cual especifica la correlación existente entre el documento XML y la estructura de tablas DB2. Los procedimientos almacenados utilizan el archivo DAD para descomponer el documento XML. Vea Planificación para utilizar colecciones XML para aprender a crear un archivo DAD.

Habilitación de una colección XML para descomposición

En la mayoría de los casos, es necesario que habilite una colección XML para poder utilizar los procedimientos almacenados. Es necesario que habilite una colección XML en estos casos:

Si desea pasar el archivo DAD espontáneamente cuando las tablas ya existen en la base de datos, no es necesario que habilite una colección XML.

Límites de tamaño de tabla de descomposición

La descomposición utiliza la correlación de nodo_RDB para especificar cómo un documento XML se descompone en tablas DB2 extrayendo los valores de elementos y de atributos en filas de tabla. Los valores para cada documento XML se almacenan en una o más tablas DB2. Cada tabla puede tener un máximo de 1.024 filas descompuestas de cada documento.

Por ejemplo, si un documento XML se descompone en cinco tablas, cada una de las cinco tablas puede tener un máximo de 1.024 filas para este documento concreto. Si la tabla tiene filas para varios documentos, puede tener un máximo de 1.024 filas para cada documento. Si la tabla tiene 20 documentos, puede tener 20.480 filas, 1.024 para cada documento.

La utilización de elementos de aparición múltiple (elementos con vías de ubicación que pueden aparecer más de una vez en la estructura XML) afecta el número de filas. Por ejemplo, un documento que contiene un elemento <Part> que aparece 20 veces, puede descomponerse como 20 filas en una tabla. Cuando utilice elementos de aparición múltiple, considere esta limitación del tamaño de tabla.

Antes de comenzar

Descomposición del documento XML

El XML Extender proporciona dos procedimientos almacenados, dxxShredXML() y dxxInsertXML(), para descomponer documentos XML.

dxxShredXML()
Este procedimiento almacenado se utiliza para aplicaciones que realizan actualizaciones ocasionales o para aplicaciones que desean eludir la actividad asociada a la administración de datos XML. El procedimiento almacenado dxxShredXML() no necesita una colección habilitada; en su lugar utiliza un archivo DAD.

Este procedimiento almacenado utiliza dos parámetros de entrada: un archivo DAD y el documento XML que se debe descomponer; devuelve dos parámetros de salida: un código de retorno y un mensaje de retorno.

El procedimiento almacenado dxxShredXML() inserta un documento XML en una colección XML de acuerdo con la especificación <Xcollection> del archivo DAD de entrada. Se supone que existen las tablas utilizadas en la especificación <Xcollection> del archivo DAD y que las columnas satisfacen los tipos de datos especificados en la correlación DAD. Si esto no es así, se devuelve un mensaje de error. Luego, el procedimiento almacenado dxxShredXML() descompone el documento XML e inserta los datos XML, sin códigos, en las tablas especificadas en el archivo DAD.

El correspondiente procedimiento almacenado para la composición es dxxGenXML(); también utiliza el archivo DAD como parámetro de entrada y no necesita que la colección XML esté habilitada.

Para descomponer una colección XML: dxxShredXML()

Intercale una llamada de procedimiento almacenado en su aplicación, mediante esta declaración:

dxxShredXML(CLOB(100K)    DAD,            /* entrada */
             CLOB(1M)      xmlobj,         /* entrada */
             long          returnCode,     /* salida */
             varchar(1024) returnMsg)      /* salida */

Consulte dxxShredXML() para conocer la sintaxis completa y ver ejemplos.

Ejemplo: Lo siguiente es un ejemplo de una llamada a dxxShredXML():

#include "dxx.h"
#include "dxxrc.h"
 
EXEC SQL INCLUDE SQLCA;
        EXEC SQL BEGIN DECLARE SECTION;
         SQL TYPE is CLOB      dad;             /* DAD*/
         SQL TYPE is CLOB_FILE  dadFile;        /* archivo DAD */
         SQL TYPE is CLOB xmlDoc;               /* documento XML de entrada */
         SQL TYPE is CLOB_FILE xmlFile;         /* archivo XML de entrada */
         long                  returnCode;      /* código de error */
         char                  returnMsg[1024]; /* texto del mensaje de error */
         short                 dad_ind;
         short                 xmlDoc_ind;
         short                 returnCode_ind;
         short                 returnMsg_ind;
         EXEC SQL END DECLARE SECTION;
 
         /* inicializar variable de lenguaje principal e indicadores */
        strcpy(dadFile.name,"c:\dxx\samples\dad\getstart_xcollection.dad");
        dadFile.name_length=strlen("c:\dxx\samples\dad\getstart_xcollection.dad");
        dadFile.file_option=SQL_FILE_READ;
        strcpy(xmlFile.name,"c:\dxx\samples\cmd\getstart_xcollection.xml");
        xmlFile.name_length=strlen("c:\dxx\samples\cmd\getstart_xcollection.xml");
        xmlFile.file_option=SQL_FILE_READ;
        SQL EXEC VALUES (:dadFile) INTO :dad;
        SQL EXEC VALUES (:xmlFile) INTO :xmlDoc;
         returnCode = 0;
         returnMsg[0] = '\0';
        dad_ind = 0;
        xmlDoc_ind = 0;
         returnCode_ind = -1;
         returnMsg_ind = -1;
 
         /* Llamar al procedimiento almacenado */
        EXEC SQL CALL db2xml!dxxShredXML(:dad:dad_ind;
                      :xmlDoc:xmlDoc_ind,
                      :returnCode:returnCode_ind,:returnMsg:returnMsg_ind); 

dxxInsertXML()
Este procedimiento almacenado se utiliza para aplicaciones que realizan actualizaciones frecuentes. Debido a que se repiten las mismas tareas, es importante conseguir un rendimiento mejorado. Habilitar una colección XML y utilizar su nombre en el procedimiento almacenado mejora el rendimiento. El procedimiento almacenado dxxInsertXML() trabaja de la misma manera que dxxShredXML(), salvo que utiliza una colección XML habilitada como primer parámetro de entrada.

El procedimiento almacenado dxxInsertXML() inserta un documento XML en una colección XML habilitada, que está asociada a un archivo DAD. El archivo DAD contiene especificaciones para las tablas de la colección y para la correlación. Las tablas de la colección se comprueban o crean de acuerdo con las especificaciones de <Xcollection>. Luego, el procedimiento almacenado dxxInsertXML() descompone el documento XML de acuerdo con la correlación e inserta datos XML, sin códigos, en las tablas de la colección XML especificada.

El correspondiente procedimiento almacenado para la composición es dxxRetrieveXML(); también utiliza como entrada el nombre de una colección XML habilitada.

Para descomponer una colección XML: dxxInsertXML()

Intercale una llamada de procedimiento almacenado en su aplicación, mediante esta declaración:

dxxInsertXML(char(UDB_SIZE) nombreColección,  /* entrada */
             CLOB(1M)      xmlobj,         /* entrada */
             long          returnCode,     /* salida */
             varchar(1024) returnMsg)      /* salida */

Consulte dxxInsertXML() para conocer la sintaxis completa y ver ejemplos.

Ejemplo: Lo siguiente es un ejemplo de una llamada a dxxInsertXML():

#include "dxx.h"
#include "dxxrc.h"
 
EXEC SQL INCLUDE SQLCA;
        EXEC SQL BEGIN DECLARE SECTION;
         char                  collection[64];  /* nombre de una colección XML */
         SQL TYPE is CLOB_FILE xmlFile;         /* archivo XML de entrada */
         SQL TYPE is CLOB      xmlDoc;          /* documento XML de entrada */
         long                  returnCode;      /* código de error */
         char                  returnMsg[1024]; /* texto del mensaje de error */
         short                 collection_ind;
         short                 xmlDoc_ind;
         short                 returnCode_ind;
         short                 returnMsg_ind;
         EXEC SQL END DECLARE SECTION;
         
         /* inicializar variable de lenguaje principal e indicadores */
         strcpy(collection,"sales_ord")
         strcpy(xmlobj.name,"c:\dxx\samples\cmd\getstart_xcollection.xml");
         xmlobj.name_length=strlen("c:\dxx\samples\cmd\getstart_xcollection.xml");
         xmlobj.file_option=SQL_FILE_READ;
         SQL EXEC VALUES (:xmlFile) INTO (:xmlDoc);
         returnCode = 0;
         returnMsg[0] = '\0';
         collection_ind = 0;
         xmlobj_ind = 0;
         returnCode_ind = -1;
         returnMsg_ind = -1;
 
         /* Llamar al procedimiento almacenado */
         EXEC SQL CALL db2xml!dxxInsertXML(:collection:collection_ind;
                      :xmlDoc:xmlDoc_ind,
                      :returnCode:returnCode_ind,:returnMsg:returnMsg_ind); 


[ Principio de página | Página anterior | Página siguiente | Contenido | Índice ]