IBM Books

Administración y programación


Lección: Almacenar un documento XML en una columna XML

Escenario

Se le ha asignado la tarea de archivar los datos de ventas para el departamento de servicio. Los datos están almacenados en documentos XML que utilizan la misma DTD. El departamento de servicio utilizará estos documentos XML cuando trabaje con pedidos y reclamaciones de los clientes.

El departamento de servicio ha suministrado una estructura recomendada para los documentos XML y ha especificado los datos de elementos que cree que se van a consultar con más frecuencia. Desean guardar los documentos XML en la tabla SALES_TAB de la base de datos SALES_DB y desearían poder buscar en ellas con rapidez. La tabla SALES_DB tendrá dos columnas con datos sobre cada venta y una tercera columna que contendrá el documento XML. Esta columna se llama ORDER.

En primer lugar, el usuario determinará los tipos de datos XML en los que se va a almacenar el documento XML, así como los elementos y atributos XML que se van a consultar con frecuencia. A continuación, configurará la base de datos SALES_DB para XML, creará la tabla SALES_TAB y habilitará la columna ORDER para almacenar el documento inalterado en DB2. También insertará una DTD para el documento XML para validación y, después, almacenará el documento como un tipo de datos XMLVARCHAR. Cuando habilite la columna, definirá las tablas secundarias que deben indexarse para la búsqueda estructural del documento en un archivo de definición de acceso a documento (DAD), un documento XML que especifica la estructura de las tablas secundarias. Para ver ejemplos del archivo DAD, de la DTD y del documento XML, vea el Apéndice B, Ejemplos.

SALES_TAB se describe en la Tabla 1.

Tabla 1. Tabla SALES_TAB
Nombre de columna Tipo de datos
INVOICE_NUM CHAR(6) NOT NULL PRIMARY KEY
SALES_PERSON VARCHAR(20)
ORDER XMLVARCHAR

Planificación

Antes de empezar a trabajar con el XML Extender para guardar los documentos, debe comprender la estructura del documento XML para poder determinar cómo buscar en el documento. Cuando planifique cómo buscar en el documento, debe determinar:

Las secciones siguientes describen cómo tomar estas decisiones.

Estructura del documento XML

La estructura del documento XML para esta lección recoge información para un pedido específico estructurada con la clave de pedido como nivel superior y, después, la información de cliente, pieza y envío en el nivel siguiente. El documento XML se describe en la Figura 4.

Esta lección también proporciona una DTD de ejemplo para que la utilice para comprender y validar la estructura del documento XML. Puede ver el archivo DTD en el Apéndice B, Ejemplos. Coincide con la estructura de la Figura 4.

Figura 4. Estructura jerárquica de la DTD y el documento XML


Estructura jerárquica de la DTD y el documento XML

Determinación del tipo de datos XML para la columna XML

El XML Extender proporciona tipos de datos de usuario XML en los que se define una columna para contener documentos XML. Estos tipos de datos son los siguientes:

En esta lección, va a almacenar un documento pequeño en DB2 y, por lo tanto, utilizará el tipo de datos XMLVarchar.

Determinación de los elementos y atributos que deben buscarse

Una vez haya comprendido la estructura del documento XML y las necesidades de la aplicación, puede determinar los elementos y atributos que deben buscarse, los elementos y atributos que se buscarán o extraerán con más frecuencia o los más caros de consultar. El departamento de servicio ha indicado que va a consultar con frecuencia la clave de pedido, el nombre de cliente, el precio y la fecha de envío de un pedido, y que va a necesitar un rendimiento rápido para estas búsquedas. Esta información está contenida en los elementos y los atributos de la estructura del documento XML. La Tabla 2 describe las vías de ubicación de cada elemento y atributo.

Tabla 2. Elementos y atributos que deben buscarse
Datos Vía de ubicación
clave de pedido /Order/@key
cliente /Order/Customer/Name
precio /Order/Part/ExtendedPrice
fecha de envío /Order/Part/Shipment/ShipDate

Correlación del documento XML con las tablas secundarias

En esta guía de aprendizaje va a crear un archivo DAD para la columna XML, que se utiliza para almacenar el documento XML en DB2. También correlaciona el contenido de los elementos y atributos XML con las tablas secundarias DB2 que se utilizan para la indexación, que mejora el rendimiento de las búsquedas. En la última sección, ha visto los elementos y atributos que van a buscarse. En esta sección, va a aprender más sobre cómo correlacionar los valores de los elementos y atributos con tablas DB2 que se pueden indexar.

Después de identificar los elementos y los atributos que se van a buscar, determinará cómo deberán organizarse en las tablas secundarias, cuántas tablas existirán y las columnas que habrá en cada tabla. Por lo general, las tablas secundarias se organizan incluyendo información similar en la misma tabla. La estructura también se determina según si la vía de ubicación de los elementos se puede repetir más de una vez en el documento. Por ejemplo, en nuestro documento, el elemento pieza se puede repetir varias veces y, por lo tanto, los elementos de precio y fecha pueden aparecer varias veces. Los elementos que pueden aparecer varias veces deben estar en sus propias tablas.

Además, también es necesario determinar los tipos base DB2 que deben utilizar los valores de los elementos y atributos. Normalmente, esto se determina fácilmente mediante el formato de los datos. Si los datos son texto, elija VARCHAR, si los datos son números enteros, elija INTEGER, o si los datos son una fecha y desea efectuar búsquedas por rango, elija DATE.

En esta guía de aprendizaje, los elementos y los atributos se correlacionan con las siguientes tablas secundarias:

ORDER_SIDE_TAB

Nombre de columna Tipo de datos Vía de ubicación ¿Aparición múltiple?
ORDER_KEY INTEGER /Order/@key No
CUSTOMER VARCHAR(16) /Order/Customer/Name No

PART_SIDE_TAB

Nombre de columna Tipo de datos Vía de ubicación ¿Aparición múltiple?
PRICE DECIMAL(10,2) /Order/Part/ExtendedPrice

SHIP_SIDE_TAB

Nombre de columna Tipo de datos Vía de ubicación ¿Aparición múltiple?
DATE DATE /Order/Part/Shipment/ShipDate

Para esta guía de aprendizaje, se proporciona un conjunto de scripts para que los utilice para configurar su entorno. Estos scripts se encuentran en el directorio DXX_INSTALL\samples\cmd (donde DXX_INSTALL es la unidad y el directorio en el que se ha instalado el XML Extender, por ejemplo c:\dxx\samples\cmd) y son los siguientes:

getstart_db.cmd
Crea la base de datos y rellena cuatro tablas.

getstart_prep.cmd
Enlaza la base de datos con los procedimientos almacenados del XML Extender y la CLI de DB2.

getstart_insertDTD.cmd
Inserta la DTD, que se utiliza para validar el documento XML, en la columna XML.

getstart_createTabCol.cmd
Crea una tabla de aplicación que tendrá una columna habilitada para XML.

getstart_alterTabCol.cmd
Modifica la tabla de aplicación añadiendo la columna que se habilitará para XML.

getstart_enableCol.cmd
Habilita la columna XML.

getstart_createIndex.cmd
Crea índices en las tablas secundarias para la columna XML.

getstart_insertXML.cmd
Inserta el documento XML en la columna XML.

getstart_queryCol.cmd
Ejecuta una sentencia select en la tabla de aplicación y devuelve el documento XML.

getstart_clean.cmd
Limpia el entorno de guía de aprendizaje.

Puesta a punto

En esta sección, se prepara la base de datos para utilizarla con el XML Extender. Va a realizar las tareas siguientes:

  1. Crear la base de datos.
  2. Habilitar la base de datos.

Creación de la base de datos

En esta sección se utiliza un mandato para preparar la base de datos. Este mandato crea una base de datos de ejemplo, se conecta a ella, crea las tablas que van a contener los datos y, después, inserta los datos.

Para crear la base de datos:

  1. Cambie al directorio DXX_INSTALL\samples\cmd, donde DXX_INSTALL es la unidad y el directorio en los que ha instalado el XML Extender. En estas lecciones se supone que el directorio es c:\dxx. Cambie estos valores si su unidad y directorio son otros.
  2. Abra la Ventana de mandatos de DB2 desde el menú Inicio de Windows NT o entre el mandato siguiente desde el indicador de mandatos de Windows NT:
    DB2CMD
    
  3. Desde la Ventana de mandatos de DB2, ejecute el mandato siguiente:
    getstart_db.cmd
    

Habilitación de la base de datos

Para guardar información XML en la base de datos, debe habilitarla para el XML Extender. Cuando habilita una base de datos para XML, el XML Extender:

Para habilitar la base de datos para XML:

Desde la Ventana de mandatos de DB2, ejecute el script siguiente para habilitar las base de datos SALES_DB:

getstart_prep.cmd

Este script enlaza la base de datos con los procedimientos almacenados del XML Extender y la CLI de DB2. También ejecuta la opción del mandato dxxadm que habilita la base de datos:

dxxadm enable_db SALES_DB

Creación de la columna XML

El XML Extender proporciona un método para almacenar y acceder a todos los documentos XML de la base de datos, llamado columna XML. Con la utilización del método de columna XML puede almacenar el documento utilizando los tipos de archivo XML, indexar la columna en tablas secundarias y, después, consultar o buscar en el documento XML. Este método de almacenamiento es particularmente útil para las aplicaciones de archivo en las que los documentos no se actualizan con frecuencia. Para la finalidad de esta guía de aprendizaje, va a guardar en la columna XML el documento XML proporcionado.

En esta lección va a guardar el documento en la tabla SALES_TAB. Para guardar el documento:

  1. Insertará la DTD para el documento XML en la tabla de referencia de DTD, DTD_REF.
  2. Preparará un archivo DAD que especifique la ubicación del documento XML y las tablas secundarias para una búsqueda estructural.
  3. Añadirá una columna a la tabla SALES_TAB con un tipo XML definido por el usuario de XMLVARCHAR.
  4. Habilitará la columna para XML.
  5. Indexará las tablas secundarias para una búsqueda estructural.
  6. Guardará el documento utilizando una función definida por el usuario, proporcionada por el XML Extender.

Almacenamiento de la DTD en el depósito de DTD

Puede utilizar una DTD para validar datos XML en una columna XML. El XML Extender crea una tabla en una base de datos habilitada para XML, llamada DTD_REF. La tabla se conoce con el nombre de referencia de DTD y está disponible para que pueda almacenar en ella las DTD. Cuando decida validar documentos XML, deberá almacenar la DTD en este depósito. La DTD para esta guía de aprendizaje es c:\dxx\samples\dtd\getstart.dtd.

Para insertar la DTD:

Desde la Ventana de mandatos de DB2, entre el siguiente mandato INSERT de SQL, todo en la misma línea:

DB2 CONNECT TO SALES_DB
DB2 INSERT into db2xml.dtd_ref values('c:\dxx\samples\dtd\getstart.dtd', 
    db2xml.XMLClobFromFile('c:\dxx\samples\dtd\getstart.dtd'), 0, 'user1', 
    'user1', 'user1')

También puede ejecutar el archivo de mandatos para insertar la DTD:

getstart_insertDTD.cmd

Preparación del archivo DAD

El archivo DAD para la columna XML tiene una estructura simple. La modalidad de almacenamiento se especifica como columna XML y las tablas y columnas se definen para indexación.

En los pasos siguientes, se hace referencia a los elementos de la DAD como códigos y a los elementos del documento XML como elementos. En c:\dxx\samples\dad\getstart_xcolumn.dad encontrará un ejemplo de archivo DAD similar al que va a crear. Tiene algunas pequeñas diferencias respecto al archivo que se genera en los pasos siguientes. Si lo utiliza para esta lección, tenga en cuenta que las vías de acceso de archivo pueden ser diferentes de las de su propio entorno, el valor <validation> está establecido en NO, en lugar de YES (SÍ).

Para preparar el archivo DAD:

  1. Abra un editor de texto y denomine el archivo como getstart_xcolumn.dad

    Tenga en cuenta que todos los códigos que se utilizan en el archivo DAD son sensibles a las mayúsculas y minúsculas.

  2. Cree la cabecera de DAD, con las declaraciones XML y Doctype.
    <?xml version="1.0"?> 
    <!DOCTYPE DAD SYSTEM "c:\dxx\dtd\dad.dtd"> 
    
    El archivo DAD es un documento XML y requiere declaraciones XML.
  3. Inserte los códigos <DAD></DAD> de apertura y cierre. Los demás códigos están incluidos dentro de estos códigos.
  4. Inserte los códigos <DTDID></DTDID> de apertura y cierre para especificar el código DTDID, que asocia la DAD con la DTD del documento XML y especifica la ubicación de DAD en el cliente.
    <dtdid>c:\dxx\samples\dtd\getstart.dtd</dtdid> 
    

    Verifique que esta serie coincida con el valor que se utiliza como primer valor de parámetro cuando se inserta la DTD en la tabla de referencia de DTD en la sección Almacenamiento de la DTD en el depósito de DTD. Por ejemplo, la vía de acceso que utilice para el DTDID puede ser diferente de la serie anterior si trabaja en una unidad de máquina distinta.

  5. Especifique los códigos <validation></validation> de apertura y cierre para indicar que el XML Extender debe validar la estructura del documento XML utilizando la DTD que se ha insertado en la tabla de depósito de DTD.
       <validation>YES</validation>
    
    El valor de <validation> debe estar en mayúsculas.
  6. Inserte los códigos <Xcolumn></Xcolumn> de apertura y cierre para definir el método de almacenamiento como columna XML. El método define que los datos XML deben almacenarse en una columna XML.
       <Xcolumn>
       </Xcolumn>
    
  7. Inserte los códigos <table></table> de apertura y cierre para cada tabla secundaria que deba generarse.
    <Xcolumn>
         <table name="order_side_tab">
         </table>
         <table name="part_side_tab">
         </table>
         <table name="ship_side_tab">
         </table>
       </Xcolumn>
    
  8. Inserte los códigos <column></column> de apertura y cierre para cada columna que deba incluirse en las tablas secundarias. Cada código <column> tiene cuatro atributos:
    <Xcolumn>
    <table name="order_side_tab">
      <column name="order_key"
              type="integer"
              path="/Order/@key" 
              multi_occurrence="NO"/>
      <column name="customer"
              type="varchar(50)"
              path="/Order/Customer/Name"
              multi_occurrence="NO"/> 
    </table>
    <table name="part_side_tab">
      <column name="price"
              type="decimal(10,2)"
              path="/Order/Part/ExtendedPrice"
              multi_occurrence="YES"/>
    </table>
    <table name="ship_side_tab">
      <column name="date"
              type="DATE"
              path="/Order/Part/Shipment/ShipDate"
              multi_occurrence="YES"/> 
    </table>
    </Xcolumn>
    
  9. Compruebe que existe un </Xcolumn> de cierre después del último código </table>.
  10. Compruebe que existe un </DAD> de cierre después del código </Xcolumn>.
  11. Guarde el archivo como getstart_xcolumn.dad.

Puede comparar el archivo que acaba de crear con el archivo de ejemplo, c:\dxx\samples\dad\getstart_xcolumn.dad. Este archivo es una copia de trabajo del archivo DAD necesario para habilitar la columna XML y crear las tablas secundarias. El archivo de ejemplo contiene las sentencias path que es posible que tengan que modificarse para que coincidan con su entorno y se ejecuten satisfactoriamente.

Creación de la tabla SALES_TAB

En esta sección creará la tabla SALES_TAB. Inicialmente tiene dos columnas con la información de venta para el pedido.

Para crear la tabla:

Desde la Ventana de mandatos de DB2, entre las sentencia CREATE TABLE siguiente:

DB2 CONNECT TO SALES_DB
 
DB2 CREATE TABLE SALES_TAB(INVOICE_NUM CHAR(6) NOT NULL PRIMARY KEY, 
         SALES_PERSON VARCHAR(20))
 

Alternativamente, puede ejecutar el archivo de mandatos siguiente para crear la tabla:

getstart_createTabCol.cmd

Adición de la columna de tipo XML

Ahora, añada una nueva columna a la tabla SALES_TAB. Esta columna contendrá el documento XML inalterado que ha generado previamente y deberá tener un UDT XML. El XML Extender proporciona varios tipos de datos, que se describen en Tipos definidos por el usuario del XML Extender. En esta guía de aprendizaje, va a guardar el documento como XMLVARCHAR.

Para añadir la columna de tipo XML:

Desde la Ventana de mandatos de DB2, entre la siguiente sentencia de SQL:

DB2 ALTER TABLE SALES_TAB ADD ORDER DB2XML.XMLVARCHAR 

Alternativamente, puede ejecutar el archivo de mandatos siguiente para modificar la tabla:

getstart_alterTabCol.cmd

Habilitación de la columna XML

Después de crear la columna de tipo XML, habilítela para el XML Extender. Cuando habilita la columna, el XML Extender lee el archivo DAD y crea las tablas secundarias. Antes de habilitar la columna debe:

Para habilitar la columna para XML:

Desde la Ventana de mandatos de DB2, entre el mandato siguiente:

dxxadm enable_column SALES_DB SALES_TAB ORDER GETSTART_XCOLUMN.DAD
        -v SALES_ORDER_VIEW -r INVOICE_NUM

Alternativamente, puede ejecutar el archivo de mandatos siguiente para habilitar la columna para XML:

getstart_enableCol.cmd

El XML Extender crea las tablas secundarias con la columna INVOICE_NUM y crea la vista por omisión.

Importante: No modifique las tablas secundarias de ningún modo. Sólo debe actualizar el documento XML utilizando las UDF proporcionadas por el XML Extender. El XML Extender actualizará automáticamente las tablas secundarias cuando actualice el documento XML en la columna XML.

Visualización de las columnas y las tablas secundarias

Cuando ha habilitado la columna XML, ha creado una vista de la columna XML y de las tablas secundarias. Puede utilizar esta vista cuando trabaje con la columna XML.

Para ver la columna XML y las columnas de tabla secundaria:

Desde la Ventana de mandatos de DB2, entre la siguiente sentencia SELECT de SQL:

DB2 SELECT * FROM SALES_ORDER_VIEW

La vista muestra las columnas de las tablas secundarias, tal como se especifica en el archivo getstart_xcolumn.dad.

Creación de índices en las tablas secundarias

La creación de índices en tablas secundarias le permite realizar búsquedas estructurales rápidas del documento XML. En este paso creará índices en columnas clave de las tablas secundarias creadas cuando habilitó la columna XML, ORDER. El departamento de servicio ha especificado las columnas que probablemente van a consultar con más frecuencia sus empleados. La Tabla 3 describe estas columnas, que va a indexar:

Tabla 3. Columnas de tabla secundaria que se van a indexar
Columna Tabla secundaria
ORDER_KEY ORDER_SIDE_TAB
CUSTOMER ORDER_SIDE_TAB
PRICE PART_SIDE_TAB
DATE SHIP_SIDE_TAB

Para indexar las tablas secundarias:

Entre los mandatos SQL siguientes desde la Ventana de mandatos de DB2:

DB2 CREATE INDEX KEY_IDX
      ON ORDER_SIDE_TAB(ORDER_KEY)
 
DB2 CREATE INDEX CUSTOMER_IDX
      ON ORDER_SIDE_TAB(CUSTOMER)
 
DB2 CREATE INDEX PRICE_IDX
      ON PART_SIDE_TAB(PRICE)
 
DB2 CREATE INDEX DATE_IDX
      ON SHIP_SIDE_TAB(DATE)

Alternativamente, puede ejecutar el archivo de mandatos siguiente para crear los índices:

getstart_createIndex.cmd

Almacenamiento del documento XML

Después de haber habilitado una columna que puede contener el documento XML y de haber indexado las tablas secundarias, puede almacenar el documento utilizando las funciones que proporciona el XML Extender. Para almacenar datos en una columna XML puede utilizar las funciones predefinidas por omisión o las UDF del XML Extender. Dado que va a almacenar un objeto del tipo base VARCHAR en una columna del UDT XML XMLVARCHAR, utilizará la función predefinida por omisión. Vea Almacenamiento de datos para obtener más información sobre las funciones predefinidas por omisión y las UDF proporcionadas por el XML Extender.

Para almacenar el documento XML:

Importante: Abra el documento de XML c:\dxx\samples\xml\getstart.xml. Asegúrese de que la vía de acceso de archivos de DOCTYPE coincide con el ID de DTD especificado en la DAD y al insertar la DTD en el depósito de DTD. Para verificar que coincidan, consulte la tabla db2xml.DTD_REF y compruebe el elemento DTDID del archivo DAD. Si utiliza una unidad y una estructura de directorios distintas de las que se asignan por omisión, tal vez tenga que modificar la vía de acceso en la declaración DOCTYPE.

Desde la Ventana de mandatos de DB2, entre el siguiente mandato INSERT de SQL:

DB2 INSERT INTO SALES_TAB (INVOICE_NUM, SALES_PERSON, ORDER) VALUES('123456', 
   'Sriram Srinivasan', db2xml.XMLVarcharFromFile('c:\dxx\samples\cmd\getstart.xml'))

Cuando almacena el documento XML, el XML Extender actualiza automáticamente las tablas secundarias.

Alternativamente, puede ejecutar el archivo de mandatos siguiente para guardar el documento:

getstart_insertXML.cmd

Para comprobar que se hayan actualizado las tablas, ejecute las siguientes sentencias SELECT para las tablas desde la Ventana de mandatos de DB2:

DB2 SELECT * FROM SALES_TAB
 
DB2 SELECT * FROM PART_SIDE_TAB
 
DB2 SELECT * FROM ORDER_SIDE_TAB
 
DB2 SELECT * FROM SHIP_SIDE_TAB
 

Búsqueda en el documento XML

Puede buscar en el documento XML con una consulta directa de las tablas secundarias. En este paso buscará todos los pedidos con un precio que esté por encima de 2500,00.

Para consultar las tablas secundarias:

Entre la siguiente sentencia SELECT desde la Ventana de mandatos de DB2:

DB2 "SELECT DISTINCT SALES_PERSON FROM SALES_TAB S, PART_SIDE_TAB P 
   WHERE PRICE > 2500.00 AND 
   S.INVOICE_NUM=P.INVOICE_NUM"
 

El conjunto de resultados debe mostrar los nombres de los vendedores que han vendido un artículo con un precio por encima de 2500,00.

Alternativamente, puede ejecutar el archivo de mandatos siguientes para buscar en el documento:

getstart_queryCol.cmd

Ha completado la guía de iniciación para almacenar documentos XML en tablas DB2. Muchos de los ejemplos del manual están basados en estas lecciones.


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