IBM Books

Administración y programación


Búsqueda de documentos XML

Buscar datos XML es similar a recuperar datos XML: ambas técnicas recuperan datos para su posterior manejo, pero la búsqueda utiliza una cláusula WHERE para definir predicados que sirven como criterios de recuperación.

El XML Extender proporciona varios métodos para buscar documentos XML en una columna XML, de acuerdo con las necesidades de la aplicación del usuario. Puede hacer una búsqueda estructural de documento y obtener resultados basados en el contenido de elementos y valores de atributos. Puede buscar una vista de la columna XML y sus tablas secundarias, buscar directamente las tablas secundarias para obtener un mejor rendimiento, o utilizar las UDF de extracción junto con cláusulas WHERE. Además, puede utilizar el Text Extender de DB2 y buscar datos de columna dentro del contenido estructural correspondiente a una cadena de texto.

A fin de realizar búsquedas rápidas, con el XML Extender puede utilizar índices de columnas de tabla secundaria, que contienen elementos o atributos XML extraídos de documentos XML. Puede especificar el tipo de datos de un elemento o atributo para buscar de acuerdo con el tipo de datos general de SQL o para realizar búsquedas dentro de un ámbito. Por ejemplo, en el supuesto referente a la orden de compra, podría buscar todos los pedidos cuyo precio global ("extended price") fuera mayor que 2500,00.

Puede también utilizar el DB2 UDB Text Extender para realizar una búsqueda estructural de texto o una búsqueda completa de texto. Por ejemplo, suponga que la columna RESUME contiene currículums de personas en formato XML. Desea obtener el nombre de todos los candidatos a un puesto de trabajo que tengan conocimientos sobre Java. Podría utilizar el Text Extender de DB2 para buscar en los documentos XML todos los currículums cuyo elemento <conocimientos> contenga la cadena de caracteres JAVA.

Las secciones siguientes describen métodos de búsqueda:

Búsqueda en el documento XML por estructura

Mediante las funciones de búsqueda del XML Extender, puede buscar datos XML de una columna basándose en la estructura del documento, es decir en elementos y atributos. Para buscar los datos de la columna, puede utilizar una sentencia SELECT de varias maneras y obtener un conjunto resultante basado en las coincidencias con elementos y atributos del documento. Puede buscar datos de columnas utilizando los métodos siguientes:

Las secciones que siguen describen estos métodos y utilizan ejemplos de acuerdo con los supuestos siguientes. La tabla de aplicación SALES_TAB tiene una columna XML llamada ORDER. Esta columna tiene tres tablas secundarias: ORDER_SIDE_TAB, PART_SIDE_TAB y SHIP_SIDE_TAB. Cuando se habilitó la columna ORDER, se especificó una vista predefinida, sales_order_view, que une las tablas secundarias utilizando la siguiente sentencia CREATE VIEW:

CREATE VIEW sales_order_view(invoice_num, sales_person, order,
                             order_key, customer, part_key, price, date)
     AS
     SELECT sales_tab.invoice_num, sales_tab.sales_person, sales_tab.order,
            order_side_tab.order_key, order_side_tab.customer,
            part_side_tab.part_key, ship_side_tab.date
     FROM sales_tab, order_side_tab, part_side_tab, ship_side_tab
     WHERE sales_tab.invoice_num = order_side_tab.invoice_num
                AND sales_tab.invoice_num = part_side_tab.invoice_num
                AND sales_tab.invoice_num = ship_side_tab.invoice_num

Búsqueda mediante consulta directa sobre tablas secundarias

La búsqueda mediante consulta y subconsulta directa proporciona un rendimiento óptimo en la búsqueda estructural cuando las tablas secundarias están indexadas. Puede utilizar una consulta o subconsulta para buscar en tablas secundarias correctamente.

Ejemplo: La sentencia siguiente utiliza una consulta y una subconsulta para buscar directamente en una tabla secundaria:

SELECT sales_person from sales_tab
       WHERE invoice_num in
          (SELECT invoice_num from part_side_tab
           WHERE price > 2500.00)

En este ejemplo, invoice_num es la clave primaria de la tabla SALES_TAB.

Búsqueda desde una vista de unión

Puede hacer que el XML Extender cree una vista predefinida que asocie la tabla de aplicación y las tablas secundarias utilizando un ID exclusivo. Puede utilizar esta vista predefinida, o cualquier vista que asocie la tabla de aplicación y las tablas secundarias, para buscar datos de columna y consultar tablas secundarias. Este método proporciona una vista virtual única de la tabla de aplicación y de sus tablas secundarias. Sin embargo, cuantas más tablas secundarias se creen, más costosa es la consulta.

Sugerencia: Puede utilizar el id_raíz, o DXXROOT_ID (creado por el XML Extender), para unir las tablas cuando cree la vista.

Ejemplo: La sentencia siguiente busca en una vista

SELECT sales_person from sales_order_view
   WHERE price > 2500.00

La sentencia de SQL devuelve los valores de sales_person a partir de la vista de unión sales_order_view, cuyos pedidos tiene un precio mayor que 2500,00.

Búsqueda mediante las UDF de extracción

Puede también utilizar las UDF de extracción del XML Extender para buscar elementos y atributos, cuando no haya creado índices ni tablas secundarias para la tabla de aplicación. La utilización de las UDF de extracción para examinar los datos XML es muy costosa y sólo debe hacerse con cláusulas WHERE que restrinjan el número de documentos XML que se incluyen en la búsqueda.

Ejemplo: La sentencia siguiente realiza una búsqueda mediante una UDF de extracción del XML Extender:

SELECT sales_person from sales_tab
     WHERE extractVarchar(order, '/Order/Customer/Name')
                        like '%IBM%'
                                AND invoice_num > 100

En este ejemplo, la UDF de extracción extrae los elementos </Order/Customer/Name> que tienen el valor "IBM".

Búsqueda de elementos o atributos de aparición múltiple

Cuando realice una búsqueda de elementos o atributos de aparición múltiple, utilice la cláusula DISTINCT para evitar valores duplicados.

Ejemplo: La sentencia siguiente realiza una búsqueda mediante la cláusula DISTINCT:

SELECT sales_person from sales_tab
       WHERE invoice_num in
              (SELECT DISTINCT invoice_num from part_side_tab
           WHERE price > 2500.00)

En este ejemplo, el archivo DAD especifica que /Order/Part/Price aparece varias veces y crea la tabla secundaria PART_SIDE_TAB para él. La tabla PART_SIDE_TAB puede contener más de una fila con el mismo valor para invoice_num. La utilización de DISTINCT permite que los valores devueltos sean exclusivos.

Utilización del Text Extender para la búsqueda estructural de texto

Cuando se realizan búsquedas de la estructura de documentos XML, el XML Extender busca valores de elementos y atributos que se convierten en tipos de datos generales, pero no busca texto. Puede utilizar el DB2 UDB Text Extender para realizar una búsqueda estructural o completa de texto en una columna que está habilitada para XML. El Text Extender da soporte a la búsqueda de documentos XML en DB2 UDB versión 6.1 o posterior.

Búsqueda estructural de texto
Busca cadenas de texto que están basadas en la estructura arborescente del documento XML. Por ejemplo, si tiene la estructura de documento /Order/Customer/Name y desea buscar la cadena de caracteres "IBM" dentro del subelemento <Customer>, puede utilizar una búsqueda estructural de texto. El documento puede también tener la cadena de caracteres "IBM" en un subelemento <Comment> o como nombre de parte de un producto. La búsqueda estructural de texto sólo busca la cadena de caracteres en los elementos especificados. En este ejemplo, sólo se obtienen los documentos que tienen "IBM" en el subelemento </Order/Customer/Name>; no se obtienen los documentos que tienen "IBM" en otros elementos, pero no en el subelemento </Order/Customer/Name>.

Búsqueda completa de texto
Busca cadenas de texto en todos los lugares de la estructura del documento, sin distinguir elementos ni atributos. En el ejemplo anterior, esta búsqueda obtendría todos los documentos que tienen la cadena de texto "IBM", con independencia del lugar donde aparece la cadena.

Para realizar búsquedas mediante el Text Extender, debe instalar dicho producto y habilitar la base de datos y las tablas tal como se describe más abajo. Para aprender a realizar búsquedas con el Text Extender, vea el capítulo del manual DB2 Universal Database Text Extender Administration and Programming referente a búsquedas hechas con las UDF del Text Extender.

Habilitación de una columna XML para el Text Extender

Si tiene una base de datos habilitada para XML, siga los pasos siguientes para que el Text Extender pueda examinar el contenido de una columna habilitada para XML. Para los fines de nuestro ejemplo, la base de datos se llama SALES_DB, la tabla se llama ORDER y los nombres de las columnas XML son XVARCHAR y XCLOB:

  1. Vea el archivo install.txt, contenido en el CD de Extenders, para conocer cómo instalar el Text Extender.
  2. Entre el mandato txstart desde una de las ubicaciones siguientes:
  3. Abra la ventana de línea de mandatos del Text Extender. En este paso se supone que el usuario tiene una base de datos llamada SALES_DB y una tabla llamada ORDER, que tiene dos columnas XML cuyos nombres son XVARCHAR y XCLOB. Puede ser necesario que ejecute los programas de ejemplo contenidos en dxx\samples\c.
  4. Conecte con la base de datos. En el indicador de mandatos de db2tx, escriba:
    'connect to SALES_DB' 
    
  5. Habilite la base de datos para el Text Extender.

    En el indicador de mandatos de db2tx, escriba:

    'enable database'
    
  6. Habilite las columnas de la tabla XML para el Text Extender; para ello defina los tipos de datos del documento XML, el idioma, las páginas de códigos y demás información sobre la columna.
  7. Compruebe el estado del índice.
  8. Defina el modelo del documento XML en el archivo de modelos de documento llamado desmodel.ini. Este archivo está situado en /db2tx/txins000 para UNIX, y en \instance\\db2tx\txins000 para Windows NT, y secciones de él se encuentran en un archivo de inicialización. Por ejemplo, para el archivo textmodel.ini:
    ;list of document models
    [MODELS]
    modelname=Order
     
    ; an 'Order' document model definition
    ; left side = section name identifier
    ; right side = section name tag
     
    [Order]
    Order = /Order
    Order/Customer/Name = /Order/Customer/Name
    Order/Customer/Email = /Order/Customer/Email
    Order/Part/@color = /Order/Part/@color
    Order/Part/Shipment/ShipMode = /Order/Part/Shipment/ShipMode
     
    

Búsqueda de texto mediante el Text Extender

El recurso de búsqueda del Text Extender funciona bien con la búsqueda estructural de documentos del XML Extender. Es aconsejable crear una consulta para buscar elementos o atributos del documento y utilizar el Text Extender para buscar el contenido de elementos o los valores de atributos.

Ejemplo: Las sentencias siguientes buscan texto de un documento XML mediante el Text Extender. En la ventana de mandatos de DB2, escriba:

'connect to SALES_DB'
'select xvarchar from order where db2tx.contains(varcharhandle,
         'model Order section(Order/Customer/Name) "Motors"')=1'
'select xclob from order where db2tx.contains(clobhandle,
         'model Order section(Order/Customer/Name) "Motors"')=1'

La UDF Contains() del Text Extender realiza una búsqueda.

Este ejemplo no contiene todos los pasos necesarios para buscar datos de columna con el Text Extender. Para obtener información sobre la búsqueda mediante el Text Extender, vea el capítulo del manual DB2 Universal Database Text Extender Administration and Programming referente a búsquedas hechas con las UDF del Text Extender.


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