IBM Books

Administración y programación


Procedimientos almacenados de composición

Los procedimientos almacenados de composición, dxxGenXML() y dxxRetrieveXML(), se utilizan para generar documentos XML a partir de datos XML existentes en tablas de base de datos. El procedimiento almacenado dxxGenXML() utiliza como entrada un archivo DAD; no necesita una colección XML habilitada. El procedimiento dxxRetrieveXML() utiliza como entrada un nombre de colección XML habilitada.

dxxGenXML()

Finalidad

Crea documentos XML utilizando datos almacenados en tablas de colección XML, que están especificadas por el elemento <Xcollection> en el archivo DAD, e inserta cada documento XML en la tabla resultante en calidad de fila. El usuario también puede abrir un cursor en la tabla resultante y obtener el conjunto resultante.

Para proporcionar flexibilidad, dxxGenXML() también permite al usuario especificar el número máximo de filas que se han de generar en la tabla resultante. Esto disminuye la cantidad de tiempo que la aplicación debe esperar los resultados durante un proceso de prueba. El procedimiento almacenado devuelve el número de filas de la tabla y la información de error producida, que incluye los códigos de error y los mensajes de error.

Para permitir realizar consultas dinámicas, dxxGenXML() admite el parámetro de entrada alter_temp (alteración temporal). Basándose en el valor de tipo_alter_temp, la aplicación puede anular la sentencia SQL_stmt, para la correlación SQL, o las condiciones del nodo_RDB, para la correlación de nodo_RDB, en el archivo DAD. El parámetro de entrada tipo_alter_temp se utiliza para especificar el tipo de alteración temporal. Para obtener detalles sobre el parámetro alter_temp, vea Anulación dinámica de valores en el archivo DAD.

dxxGenXML(CLOB(100K)     DAD,             /* entrada */
             char(UDB_SIZE) nombreTabResul  /* entrada */
          integer        tipo_alter_temp  /* entrada */
          varchar(1024)  alter_temp,      /* entrada */
             integer        máxFilas,           /* entrada */
             integer        númFilas,           /* salida */
             long           códigoRetorno,    /* salida */
             varchar(1024)  mensRetorno)      /* salida */

Parámetros

Tabla 46. Parámetros de dxxGenXML()
Parámetro Descripción Parámetro de E/S
DAD Es un CLOB donde reside el archivo DAD. ENTRADA
nombreTabResul Es el nombre de la tabla resultante, la cual debe existir antes de ejecutar la llamada. La tabla contiene una sola columna, de tipo XMLVARCHAR o XMLCLOB. ENTRADA
tipo_alter_temp Es un distintivo que indica el tipo del parámetro alter_temp que sigue a continuación:
  • NO_OVERRIDE: Sin alteración temporal.
  • SQL_OVERRIDE: Alteración temporal por una sentencia SQL_stmt.
  • XML_OVERRIDE: Alteración temporal por una condición basada en XPath.
ENTRADA
alter_temp Invalida la condición especificada en el archivo DAD. El valor de entrada está basado en tipo_alter_temp.
  • NO_OVERRIDE: Es una serie nula.
  • SQL_OVERRIDE: Es una sentencia SQL válida. Si se utiliza este valor para tipo_alter_temp, se debe utilizar la correlación SQL en el archivo DAD. La sentencia SQL de entrada invalida la sentencia SQL_stmt especificada en el archivo DAD.
  • XML_OVERRIDE: Serie de caracteres que contiene una o más expresiones entre comillas dobles, separadas por "AND". Si se utiliza este valor para tipo_alter_temp, se debe utilizar la correlación de nodo_RDB en el archivo DAD.
ENTRADA
máxFilas Es el número máximo de filas de la tabla resultante. ENTRADA
númFilas Es el número real de filas creadas de la tabla resultante. SALIDA
códigoRetorno Es el código de retorno que emite el procedimiento almacenado. SALIDA
mensRetorno Es el texto del mensaje que se devuelve en caso de error. SALIDA

Ejemplos

En el ejemplo, se crea la tabla resultante XML_ORDER_TAB, la cual tiene una sola columna de tipo XMLVARCHAR.

#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;          /* archivo DAD */
              char    result_tab[32];    /* nombre de la tabla resultante */
              char    override[2];       /* alteración temporal, para nulo */
              short   overrideType;      /* definido en dxx.h */
              short   max_row;           /* número máximo de filas */
              short   num_row;           /* número real de filas */
              long    returnCode;        /* código de error de retorno */
              char                  returnMsg[1024]; /* texto del mensaje de error */
              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;
              
              /* crear tabla */
         EXEC CREATE TABLE xml_order_tab (xmlorder XMLVarchar);
 
     /* leer datos de un archivo y ponerlos en un CLOB */
              strcpy(dadfile.name,"e:\dxx\dad\litem3.dad");
              dadfile.name_length = strlen("e:\dxx\dad\litem3.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;
 
              /* Llamar al procedimiento almacenado */
     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); 

dxxRetrieveXML()

Finalidad

Permite que un mismo archivo DAD sea utilizado tanto para la composición como para la descomposición. El procedimiento almacenado dxxRetrieveXML() también sirve para recuperar documentos XML descompuestos. dxxRetrieveXML() utiliza como entrada un almacenamiento intermedio donde está el archivo DAD, el nombre de la tabla resultante creada y el número máximo de filas a devolver. Devuelve un conjunto resultante formado por la tabla resultante, el número real de filas del conjunto resultante, un código de error y un texto de mensaje.

Para permitir realizar consultas dinámicas, dxxRetrieveXML() admite el parámetro de entrada alter_temp (alteración temporal). Basándose en el valor de tipo_alter_temp, la aplicación puede anular la sentencia SQL_stmt, para la correlación SQL, o las condiciones del nodo_RDB, para la correlación de nodo_RDB, en el archivo DAD. El parámetro de entrada tipo_alter_temp se utiliza para especificar el tipo de alteración temporal. Para obtener detalles sobre el parámetro alter_temp, vea Anulación dinámica de valores en el archivo DAD.

Los requisitos del archivo DAD para dxxRetrieveXML() son los mismos que para dxxGenXML(). La única diferencia es que el archivo DAD no es un parámetro de entrada de dxxRetrieveXML(), sino que se utiliza el nombre de una colección XML habilitada.

dxxRetrieveXML(char(UDB_SIZE) nombreColección,  /* entrada */
             char(UDB_SIZE) nombreTabResul  /* entrada */
             integer        tipo_alter_temp,    /* entrada */
          varchar(1024)  alter_temp,      /* entrada */
             integer        máxFilas,           /* entrada */
             integer        númFilas,           /* salida */
             long           códigoRetorno,    /* salida */
             varchar(1024)  mensRetorno)      /* salida */

Parámetros

Tabla 47. Parámetros de dxxRetrieveXML()
Parámetro Descripción Parámetro de E/S
nombreColección Es el nombre de una colección XML habilitada. ENTRADA
nombreTabResul Es el nombre de la tabla resultante, la cual debe existir antes de ejecutar la llamada. La tabla contiene una sola columna, de tipo XMLVARCHAR o XMLCLOB. ENTRADA
tipo_alter_temp Es un distintivo que indica el tipo del parámetro alter_temp que sigue a continuación:
  • NO_OVERRIDE: Sin alteración temporal.
  • SQL_OVERRIDE: Alteración temporal por una sentencia SQL_stmt.
  • XML_OVERRIDE: Alteración temporal por una condición basada en XPath.
ENTRADA
alter_temp Invalida la condición especificada en el archivo DAD. El valor de entrada está basado en tipo_alter_temp.
  • NO_OVERRIDE: Es una serie nula.
  • SQL_OVERRIDE: Es una sentencia SQL válida. Si se utiliza este valor para tipo_alter_temp, se debe utilizar la correlación SQL en el archivo DAD. La sentencia SQL de entrada invalida la sentencia SQL_stmt especificada en el archivo DAD.
  • XML_OVERRIDE: Serie de caracteres que contiene una o más expresiones entre comillas dobles, separadas por "AND". Si se utiliza este valor para tipo_alter_temp, se debe utilizar la correlación de nodo_RDB en el archivo DAD.
ENTRADA
máxFilas Es el número máximo de filas de la tabla resultante. ENTRADA
númFilas Es el número real de filas creadas de la tabla resultante. SALIDA
códigoRetorno Es el código de retorno que emite el procedimiento almacenado. SALIDA
mensRetorno Es el texto del mensaje que se devuelve en caso de error. SALIDA

Ejemplos

Lo siguiente es un ejemplo de una llamada a dxxRetrieveXML(). En este ejemplo, se crea la tabla resultante XML_ORDER_TAB, la cual tiene una sola columna de tipo XMLVARCHAR.

#include "dxx.h" 
#include "dxxrc.h"
 
EXEC SQL INCLUDE SQLCA;
            EXEC SQL BEGIN DECLARE SECTION;
              char    collection[32];    /* almacenamiento intermedio con DAD */
              char    result_tab[32];    /* nombre de la tabla resultante */
              char    override[2];       /* alteración temporal, para nulo */
              short   overrideType;      /* definido en dxx.h */
              short   max_row;           /* número máximo de filas */
              short   num_row;           /* número real de filas */
              long    returnCode;        /* código de error de retorno */
              char                  returnMsg[1024]; /* texto del mensaje de error */
              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;
              
              /* crear tabla */
              EXEC SQL CREATE TABLE xml_order_tab (xmlorder XMLVarchar);
 
              /* inicializar variable de lenguaje principal e indicadores */
              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;
 
              /* Llamar al procedimiento almacenado */
              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); 


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