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:
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
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.
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.
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".
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.
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.
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.
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:
'connect to SALES_DB'
En el indicador de mandatos de db2tx, escriba:
'enable database'
'enable text column order xvarchar function db2xml.varchartovarchar handle varcharhandle ccsid 850 language us_english format xml indextype precise indexproperty sections_enabled documentmodel (Order) updateindex update'
'enable text column order xclob function db2xml.clob handle clobhandle ccsid 850 language us_english indextype precise updateindex update'
;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
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.