Preparación para el examen 730 Fundamentos DB2 9, Parte 7: Presentando XQuery

DB2® 9 se caracteriza por el soporte de XQuery, un lenguaje estándar de la industria diseñado expresamente para consultar datos XML. Con XQuery y DB2 9 usted puede recuperar documentos XML enteros o fragmentos XML almacenados en columnas XML. Usted también puede especificar filtros basados en XML para consultas, transformar resultados XML e incorporar lógica condicional en las consultas. Este tutorial se introduce al soporte XQuery del DB2, explica varios conceptos básicos de lenguaje y muestra cómo puede escribir y ejecutar XQueries simples contra datos XML almacenados en el DB2. Este es el séptimo de una serie de siete tutoriales para ayudarle a prepararse para el examen 730 sobre Fundamentos DB2 9.

Cynthia M. Saracco, Senior Software Engineer, IBM

C. M. Saracco es ingeniera de software sénior en el IBM Silicon Valley Laboratory. Ha escrito dos libros sobre administración de base de datos (en uno como co-autora con Charles J. Bontempo) y dicta seminarios en Norteamérica, Suramérica y Europa.



16-02-2012

Antes de comenzar

Para ayudarle a prepararse para los exámenes de certificación DB2, este tutorial le introduce a XQuery y a su soporte en DB2. Usted ya deberá estar familiarizado(a) con DB2 versión 9 y con su soporte pureXML antes de tomar este tutorial.

Este tutorial se enfoca en el uso de XQuery para consultar datos DB2 XML. Proporciona una discusión bastante limitada sobre el uso de SQL/XML (SQL con extensiones XML) para consultar datos DB2 XML. Para más información sobre el soporte DB2 para funciones SQL/XML estándar de la industria, vea Recursos.

Sobre esta serie

¿Está pensando en obtener la certificación en fundamentos DB2 (Examen 730)? Si es así, ha llegado al lugar correcto. Esta serie de siete tutoriales de preparación para la certificación DB2 cubre todo lo básico (los temas que necesitará entender antes de leer la primera pregunta del examen). Incluso si usted no está pensando en obtener la certificación justo ahora, este conjunto de tutoriales es un excelente lugar para comenzar a saber qué hay de nuevo en DB2 9.

Acerca de este tutorial

Este tutorial explora capacidades básicas del nuevo soporte XQuery del DB2. Este tutorial revisa las diferencias clave entre XQuery y SQL, explora expresiones XPath y "FLWOR" básicos y le enseña cómo escribir XQueries simples sobre datos DB2 XML.

Este tutorial es para usuarios DB2 que planeen trabajar con documentos XML almacenados en sus estructuras jerárquicas nativas dentro de columnas XML de tablas DB2. El material de este tutorial cubre temas XML que se tratan en las Secciones 1, 4 y 5 de la prueba. Usted puede ver estos objetivos en: http://www-03.ibm.com/certify/tests/obj730.shtml. Usted ya debe estar familiarizado(a) con las tecnologías XML básicas y con el nuevo soporte pureXML del DB2, antes de tomar este tutorial. De ser necesario, consulte los Recursos para material de respaldo.

Objetivos

Después de completar este tutorial, usted deberá estar en capacidad de:

  • Entender conceptos XQuery fundamentales
  • Escribir XQueries simples usando diversas expresiones comunes

Requisitos previos

Este tutorial es para personas que estén familiarizadas con tecnología XML básica y con el nuevo soporte del DB2 para almacenamiento y administración de datos pureXML. Usted debe entender la naturaleza jerárquica de los documentos XML, el concepto de la buena formación, y cómo se pueden usar los elementos y atributos. Usted también debe entender cómo puede almacenar documentos XML bien formados en su estructura jerárquica nativa usando DB2 9.

Requisitos de sistema

Usted no necesita una copia DB2 para completar este tutorial, pero para ejecutar los ejemplos usted necesita un sistema en el que esté instalado el DB2 9. Cualquier plataforma soportada será suficiente, pero algunos de los ejemplos están ajustados a las plataformas Windows. Usted aprovechará mejor el tutorial si descarga la versión gratuita de prueba del IBM DB2 9 para trabajar junto con este tutorial.


Visión general de XQuery

El DB2 9 introduce el soporte para XQuery, un nuevo lenguaje diseñado específicamente para trabajar con datos XML. Parte del estándar de la industria W3C, XQuery permite a los usuarios navegar a través de la estructura jerárquica inherente a los documentos XML. Como resultados, usted puede recuperar documentos XML o fragmentos de documentos usando XQuery. Usted también puede escribir XQueries que incluyan predicados basados en XML para "filtrar" datos no deseados de los resultados que retornará el DB2. XQuery ofrece muchas otras capacidades, como la capacidad de transformar resultados XML e incorporar lógica condicional en sus consultas.

Antes de aprender cómo usar XQuery, usted necesita entender algunos conceptos fundamentales sobre el lenguaje.

Fundamentos de XQuery

Una XQuery siempre transforma un valor del Modelo de Datos XQuery en otro valor del Modelo de Datos XQuery. Un valor del Modelo de Datos XQuery es una secuencia de cero o más elementos. Un elemento puede ser:

  • Un valor atómico
  • Un nodo XML como un elemento, atributo o nodo de texto (algunas veces llamado un fragmento de documento XML)
  • Un documento XML completo

Con frecuencia, la entrada de una XQuery es una colección de documentos XML.

El Listado 1 muestra un documento XML que contiene ocho nodos de elemento, un nodo de atributo y seis nodos de texto. Los nodos de elemento son representados por etiquetas de elemento. Client, Address, street, city, state, zip, y ambos elementos de email son todos nodos de elemento de este documento. Si usted observa de cerca al elemento Client, podrá ver que contiene un nodo de atributo para el id del cliente. Algunos de los nodos de elemento del documento tienen nodos de texto asociados a ellos. Por ejemplo, el nodo de texto para el elemento ciudad es San José.

Listado 1. Documento XML de muestra
<Client id="123"> 
	<Address>
		<street>9999 Elm St.</street>
		<city>San Jose</city>
		<state>CA</state>
		<zip>95141</zip>
	</Address>
	<email>anyemail@yahoo.com</email>
	<email>anotheremail@yahoo.com</email>
</Client>

La Figura 1 muestra los nodos dentro de este documento de muestra.

Figura 1. Nodos de texto element, attribute y text en un documento XML de muestra
Nodos de texto element, attribute y text en un documento XML de muestra

El lenguaje XQuery se extrae de otros estándares XML como XPath, el cual define cómo los usuarios pueden navegar por un documento XML, y XML Schema, el cual permite a los usuarios especificar la estructura válida y los tipos de datos para sus documentos. Usted aprenderá cómo incorporar expresiones XPath en XQueries en este tutorial.

XQuery proporciona varios tipos diferentes de expresiones que usted puede combinar de cualquier forma que usted quiera. Cada expresión retorna una secuencia de valores que puede ser usada como entrada para otras expresiones. El resultado de la expresión más externa es el resultado de la consulta.

Este tutorial discute dos tipos importantes de expresiones XQuery:

Expresión de ruta
Permite a los usuarios navegar, o ir "paso a paso" por la jerarquía de un documento XML y retornar nodos que se encuentran en la parte final de la ruta.
Expresión FLWOR
Es mucho más como una expresión SELECT-FROM-WHERE en SQL. Se utiliza para iterar a través de una secuencia de elementos y para retornar opcionalmente algo que es computado desde cada elemento.

Cómo difiere XQuery de SQL

Muchos usuarios SQL suponen de forma equivocada que XQuery es muy similar a SQL. Sin embargo, XQuery difiere de SQL en muchas formas, en gran medida porque los lenguajes fueron diseñados para trabajar con diferentes modelos de datos que tienen diferentes características. Los documentos XML contienen jerarquías y poseen un orden inherente. En contraste, las tablas soportadas por DBMSs relacionales (o más precisamente DBMSs basados en SQL) son planos y basados en conjuntos, por lo que las filas no son ordenadas.

Estas son algunas de las diferencias entre XQuery y SQL. Proporcionar una lista exhaustiva está más allá del alcance de este tutorial de introducción, pero los Recursos incluyen más sobre este tema.

Estas diferencias en los modelos de datos dan como resultado diferencias significativas en los lenguajes de consulta diseñados para soportar cada uno de ellos. Por ejemplo, XQuery permite a los programadores navegar a través de la estructura jerárquica XML. El SQL plano (sin extensiones XML) no tiene (o necesita) expresiones equivalentes para "navegar" a través de estructuras de datos tabulares. XQuery soporta tanto datos con tipo como sin tipo, mientras que los datos SQL siempre están definidos dentro de un tipo específico. A XQuery le faltan valores nulos porque los documentos XML omiten datos faltantes o desconocidos. SQL utiliza los nulos para representar valores de datos faltantes o desconocidos. XQuery retorna secuencias de datos XML; SQL retorna conjuntos de resultados de varios tipos de datos SQL. Finalmente, XQuery solo funciona con datos XML. SQL funciona sobre columnas definidas sobre tipos SQL tradicionales, y SQL/XML (SQL con extensiones XML) funciona tanto con datos XML como con tipos tradicionales de datos SQL.

Expresiones de ruta en XQuery

XQuery soporta expresiones XPath que permiten a los usuarios navegar a través de una jerarquía de documento XML para ubicar porciones de interés. Discutir XPath detalladamente está más allá del alcance de este tutorial, pero aquí revisaremos algunos ejemplos simples.

Las expresiones XPath se ven muy similares a las expresiones que usted usa cuando trabaja con un sistema de archivos de una computadora tradicional. Considere cómo navegar a través de directorios Unix o Windows, y usted tendrá una idea de cómo puede navegar a través de un documento XML usando XPath.

Una expresión de ruta en XQuery consiste en una serie de "pasos" separados por caracteres de barra inclinada. En su forma más simple, cada paso navega hacia abajo en una jerarquía XML para encontrar los hijos de los elementos retornados por el paso anterior. Cada paso de la expresión también puede contener un predicado que filtre los elementos que se retornan en cada paso, reteniendo únicamente los elementos que satisfacen alguna condición. En un momento verá un ejemplo.

Una tarea común que involucra navegar desde la raíz del documento XML (el nivel superior en la jerarquía XML) hasta un nodo de interés particular. Por ejemplo, para recuperar los elementos de e-mail en el documento mostrado en el Listado 2 abajo, usted podría escribir:

Listado 2. Navegando hacia los elementos de e-mail
/Client/email

Si el documento contiene múltiples elementos de e-mail y usted solo desea recuperar el primero, podría escribir:

Listado 3. Navegando hacia el primer elemento de e-mail
/Client/email[1]

Además de especificar nodos de elemento en sus expresiones de ruta, usted puede especificar nodos usando el signo @ para distinguir un atributo de un elemento. Esta expresión de ruta navega hacia el primer elemento Client que contenga un atributo id igual a 123:

Listado 4. Especificando un nodo de atributo y un valor
/Client[@id='123']/email[1]

El ejemplo anterior incorporó un predicado de filtro basado en un valor de atributo. Usted también puede filtrar en otros valores de nodo. Con bastante frecuencia, XPath usa filtros en valores de elementos, como se muestra en esta expresión que retorne el elemento zip para todos los clientes que viven en California:

Listado 5. Filtrando con un valor de elemento
/Client/Address[state="CA"]/zip

Usted puede usar un caracter comodín ("*") para que coincida con el paso respectivo en su expresión de ruta. El siguiente ejemplo recupera un elemento de ciudad que se encuentra por debajo de cualquier hijo inmediato del elemento Client.

Listado 6. Usando un caracter comodín
/Client/*/city

Dado nuestro documento de ejemplo, esto retornará un elemento de ciudad con el valor San José. Una forma más precisa de navegar hacia este elemento city individual sería:

Listado 7. Una forma más precisa para navegar hacia el elemento city
/Client/Address/city

El Listado 8 muestra algunos ejemplos de otros tipos de expresiones de ruta.

Listado 8. Más expresiones de ruta y sus significados

Haga clic para ver la lista de códigos

Listado 8. Más expresiones de ruta y sus significados

//*                        (Recupera todos los nodos del documento)

//email                    (Encuentra elementos de email en cualquier parte del documento)

/Client/email[1]/text()    (Recupera el nodo de texto del primer elemento de e-mail que hay debajo del elemento Client)
/Client/Address/*          (Selecciona todos los nodos hijos del sub-elemento Address del elemento raíz Client)

/Client/data(@id)          (Retorna el valor del atributo id del elemento Client)

/Client/Address[state="CA"]/../email    (Encuentra los elementos email de los clientes que tengan una dirección en California. 
                             El paso ".." navega de regreso al padre del nodo Address).

Note que la ruta XPath distingue mayúsculas y minúsculas. Es importante recordar esto cuando se escriben XQueries, dado que esto representa otra forma en la que XQuery difiere de SQL. Por ejemplo, si usted incorpora la expresión "/client/address" en su XQuery, ahora usted recibirá cualquier resultado del documento de muestra mostrado en El Listado 1.

Expresiones FLWOR en XQuery

A menudo las personas se refieren a expresiones FLWOR en XQuery. Así como un bloque SELECT-FROM-WHERE en SQL, una expresión XQuery FLWOR puede contener múltiples cláusulas denotadas por palabras clave. Las cláusulas de una expresión FLWOR comienzan con las siguientes palabras clave:

  • for: Itera a través de una secuencia de entrada, vinculando una variable a cada elemento de entrada en turno
  • let: Declara una variable y la asigna a un valor, el cual puede ser una lista que contiene múltiples elementos
  • where: Especifica criterios para filtrar resultados de consulta
  • order by: especifica el orden de clasificación del resultado
  • return: Define el resultado a ser retornado

Vamos a revisar cada palabra brevemente. Hablaremos sobre for y en el return en una sección para que usted pueda ver un ejemplo completo. (Sin la cláusula return , la expresión estaría incompleta).

for y en el return
Las palabras clave for y return se utilizan para iterar sobre una secuencia de valores y para retornar algo para cada valor. El siguiente es un ejemplo muy simple:
for $i in (1, 2, 3)
return $i

En XQuery, los nombres de variable tienen como prefijo el signo de moneda ("$"). Así, el ejemplo previo vincula los valores numéricos 1, 2 y 3 a la variable $i, uno a la vez, y para cada uno retorna el valor de $i. El resultado de la expresión anterior es una secuencia de tres valores:

1
2
3
let
Algunas veces las personas tienen dificultades distinguiendo entre cuándo usar la palabra clave let en lugar de for. La palabra clave let no itera a través de una secuencia de entrada, vinculando cada elemento a una variable en turno (como hace la palabra clave for ). En lugar de ello, let asigna un valor de entrada individual a una variable, pero este valore de entrada puede ser una secuencia o cero, uno, o más elementos. Como resultado, for y en el let se comportan de forma muy diferente en XQueries.

Un ejemplo debe ayudar a dar claridad sobre la diferencia. Considere la siguiente expresión que usa la palabra clave for y preste atención al resultado retornado:

for $i in (1, 2, 3) 
return <output> {$i} </output>


<output>1</output>
<output>2</output>
<output>3</output>

La línea final de la expresión hace que el nuevo elemento llamado output sea retornado para cada iteración. El valor de este elemento es el valor de $i. Como $i está configurado a los valores numéricos 1, 2 y 3 uno a la vez, la expresión XQuery retorna tres elementos de resultado, cada uno con un valor diferente.

Ahora considere una expresión similar que use la palabra clave let :

let $i := (1, 2, 3) 
return <output>{$i}</output>


<output>1 2 3</output>

El resultado es bastante diferente. Este consiste en un solo elemento de resultado con el valor "1 2 3".

Estos dos ejemplos ilustran un punto importante a recordar: la palabra clave for itera los elementos de una secuencia de entrada, uno a la vez, enlazando cada uno a la variable especificada de turno. En contraste la palabra clave let vincula todos los elementos de la secuencia de entrada a la vez, con la variable especificada.

where
En XQuery, where funciona de manera bastante similar a la cláusula WHERE en SQL: esta le permite aplicar criterios de filtro a su consulta. Considere el siguiente ejemplo:
for $i in (1, 2, 3) 
where $i < 3 
return <output>{$i}</output>


<output>1</output>
<output>2</output>
order by
Le permite hacer que se retornen resultados en el orden que usted especifique. Considere la siguiente expresión simple XQuery y su resultado (la cual no está ordenada de acuerdo a órdenes especificadas por usuario):
for $i in (5, 1, 2, 3)
return $i

5
1
2
3

Usted puede usar la palabra clave order by para ordenar resultados según lo desee. Este ejemplo hace que los resultados se retornen en orden descendente:

for $i in (5, 1, 2, 3)
order by $i descending 
return $i

5
3
2
1

Soporte DB2 para XQuery

DB2 trata a XQuery como un lenguaje de primera clase, permitiendo a los usuarios escribir expresiones XQuery directamente, en lugar de requerir que los usuarios incorporen o empaqueten XQueries en enunciados SQL. El motor de consultas del DB2 procesa XQueries de forma nativa, lo cual significa que analiza, evalúa y optimiza XQueries sin traducirlas nunca a SQL en segundo plano. Si usted lo desea, puede escribir consultas "bilingües" que incluyan expresiones XQuery y SQL. DB2 también procesará y optimizará estas consultas.

Para ejecutar una XQuery directamente en DB2, usted debe anteponer a la consulta loa palabra xquery. Esto da la instrucción al DB2 para que invoque a su analizador XQuery para que procese su solicitud. Usted solo necesita hacer esto si está usando XQuery como el lenguaje más externo (o de nivel superior). Si usted incorpora expresiones XQuery en SQL, no necesitará anteponerles la palabra clave xquery .

En este tutorial usted estará usando XQuery como el lenguaje principal, por lo que todas las consultas mostradas tendrán antepuesta xquery.


Entorno de base de datos de muestra

Para ayudarle a aprender XQuery, este tutorial se refiere a una tabla "clients" de muestra que contiene algunos documentos XML. Las siguientes secciones explican esta tabla y sus contenidos detalladamente y describen las herramientas DB2 suministradas que usted puede usar para emitir XQueries.

Si usted desea configurar su sistema DB2 para que incluye una tabla de muestra y contenidos, un script, tutorial.sql, está disponible. Este contiene todo el código mostrado en esta sección.

Tabla de muestra

La tabla de clientes de nuestros ejemplos contiene columnas basadas en tipos de datos SQL tradicionales (como cadenas de caracteres enteras y de longitud variable), y una columna basada en el nuevo tipo de datos SQL "XML".

Las primeras tres columnas rastrean información sobre los ID, nombres y estado de los clientes. Los valores típicos de las columnas de estado incluyen Gold, Silver y Standard. La cuarta columna contiene la información de contacto de cada cliente, como la dirección de correspondencia de su casa, números de teléfono, direcciones de e-mail, y demás. Tal información es almacenada en documentos XML bien formados.

Así es como está definida la tabla de clientes:

Listado 9. Definición de tabla Client
create table clients(
id 		int primary key not null, 
name 		varchar(50), 
status 		varchar(10), 
contactinfo 	xml
);

Documentos XML de muestra

Antes de explorar cómo escribir XQueries contra esta tabla, usted necesita llenarla con algunos datos de muestra. Los siguientes enunciados SQL insertan seis filas en la tabla de los clientes. Cada fila contiene un documento XML, y la estructura de cada documento XML varía de alguna forma. Por ejemplo, las direcciones de e-mail están disponibles para algunos clientes, pero no para otros.

Listado 10. Datos de muestra para la tabla de clientes
insert into clients values (3227, 'Ella Kimpton', 'Gold', 
'<Client> 
	<Address>
		<street>5401 Julio Ave.</street>
		<city>San Jose</city>
		<state>CA</state>
		<zip>95116</zip>
	</Address>
	<phone>
		<work>4084630000</work>
		<home>4081111111</home>
		<cell>4082222222</cell>
	</phone>
	<fax>4087776666</fax>
	<email>love2shop@yahoo.com</email>
</Client>'
);


insert into clients values (8877, 'Chris Bontempo', 'Gold', 
'<Client>
	<Address>
		<street>1204 Meridian Ave.</street>
		<apt>4A</apt>
		<city>San Jose</city>
		<state>CA</state>
		<zip>95124</zip>
	</Address>
	<phone>
		<work>4084440000</work>
	</phone>
	<fax>4085555555</fax>
</Client>'
);


insert into clients values (9077, 'Lisa Hansen', 'Silver', 
'<Client>
	<Address>
		<street>9407 Los Gatos Blvd.</street>
		<city>Los Gatos</city>
		<state>CA</state>
		<zip>95032</zip>
	</Address>
	<phone>
		<home>4083332222</home>
	</phone>
</Client>'
);


insert into clients values (9177, 'Rita Gomez', 'Standard', 
'<Client>
	<Address>
		<street>501 N. First St.</street>
		<city>Campbell</city>
		<state>CA</state>
		<zip>95041</zip>
	</Address>
	<phone>
		<home>4081221331</home>
		<cell>4087799881</cell>
	</phone>
	<email>golfer12@yahoo.com</email>
</Client>'
);


insert into clients values (5681, 'Paula Lipenski', 'Standard', 
'<Client>
	<Address>
		<street>1912 Koch Lane</street>
		<city>San Jose</city>
		<state>CA</state>
		<zip>95125</zip>
	</Address>
	<phone>
		<cell>4085430091</cell>
	</phone>
	<email>beatlesfan36@hotmail.com</email>
	<email>lennonfan36@hotmail.com</email>
</Client>'
); 


insert into clients values (4309, 'Tina Wang', 'Standard', 
'<Client>
	<Address>
		<street>4209 El Camino Real</street>
		<city>Mountain View</city>
		<state>CA</state>
		<zip>95033</zip>
	</Address>
	<phone>
		<home>6503310091</home>
	</phone>
</Client>'
);

Entorno de consulta

Todas las consultas de este tutorial están diseñadas para ser emitidas interactivamente. Usted puede hacer esto mediante el procesador de línea de comandos del DB2 Command Editor del DB2 Control Center. Los ejemplos en este tutorial usan el procesador de línea de comandos DB2. (El DB2 también incluye un Developer Workbench basado en Eclipse que puede ayudarle a construir XQueries gráficamente, pero la discusión sobre el Developer Workbench va más allá del ámbito de este tutorial).

Usted puede cambiar las configuraciones predeterminadas para el procesador de línea de comandos DB2, para que sea más fácil trabajar con datos XML. Por ejemplo, el siguiente comando (emitido desde una ventana de comandos DB2) iniciará el procesador de comandos DB2 de una manera que hará que los resultados XQuery sean mostrados en un formato que es fácil de leer:

Listado 11. Configurando opciones de procesamiento de línea de comandos DB2
db2 -i -d

Este comando hace que DB2 añada espacios en blanco adicionales a los resultados mostrados de XQueries. DB2 realmente no añade estos espacios en blanco a sus datos. Sus aplicaciones no verán elementos retornados con espacios en blanco adicionales (estos solo serán visibles desde la ventana del procesador de línea de comandos DB2).


Operaciones simples de recuperación de datos XML

En esta sección usted aprenderá cómo escribir XQueries que recuperen documentos XML y porciones específicas (o fragmentos) de documentos XML. Para hacerlo, usted usa expresiones XPath y expresiones FLWOR.

Recuperando documentos XML completos almacenados en DB2

Cuando se está ejecutando como lenguaje de nivel superior, AQuery necesita tener una fuente de datos de entrada. En DB2, una forma en la que usted puede especificar esta fuente de datos de entrada es invocando una función llamada db2-fn:xmlcolumn. esta función toma un parámetro de entrada que identifica la tabla DB2 y el nombre de columna XML de interés. La función db2-fn:xmlcolumn retorna una secuencia de documentos XML que se almacena en la columna dada. Por ejemplo, la siguiente consulta retorna una secuencia de documentos XML que contienen información de contacto del cliente:

Listado 12. XQuery simple para retornar datos de contacto del cliente
xquery 
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')

Tal vez usted se pregunta por qué los nombres de tabla y de columna especificados en esta consulta están en mayúscula. Si usted recuerda el enunciado SQL usado anteriormente para crear esta tabla, usted sabe que los nombres de columna y tabla se escribieron en minúsculas. A menos que usted especifique lo contrario, el DB2 convierte los nombres de tabla y columna a mayúsculas en su catálogo interno. Como XQuery distingue mayúsculas y minúsculas, los nombres de tabla y columna en minúsculas fallarán en coincidir con sus nombres en mayúscula en el catálogo DB2.

Ahora, vamos a considerar el resultado de esta XQuery. Dados los datos de muestra insertados en la tabla de clientes, es el resultado de la consulta del Listado 12 es una secuencia de seis documentos XML, como se muestra a continuación.

Listado 13. Resultado de la consulta anterior
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			5401 Julio Ave.
		</street>
		<city>
			San Jose
		</city>
		<state>
			CA
		</state>
		<zip>
			95116
		</zip>
	</Address>
	<phone>
		<work>
			4084630000
		</work>
		<home>
			4081111111
		</home>
		<cell>
			4082222222
		</cell>
	</phone>
	<fax>
		4087776666
	</fax>
	<email>
		love2shop@yahoo.com
	</email>
</Client>
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			1204 Meridian Ave.
		</street>
		<apt>
			4A
		</apt>
		<city>
			San Jose
		</city>
		<state>
			CA
		</state>
		<zip>
			95124
		</zip>
	</Address>
	<phone>
		<work>
			4084440000
		</work>
	</phone>
	<fax>
		4085555555
	</fax>
</Client>
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			9407 Los Gatos Blvd.
		</street>
		<city>
			Los Gatos
		</city>
		<state>
			CA
		</state>
		<zip>
			95032
		</zip>
	</Address>
	<phone>
		<home>
			4083332222
		</home>
	</phone>
</Client>
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			501 N. First St.
		</street>
		<city>
			Campbell
		</city>
		<state>
			CA
		</state>
		<zip>
			95041
		</zip>
	</Address>
	<phone>
		<home>
			4081221331
		</home>
		<cell>
			4087799881
		</cell>
	</phone>
	<email>
		golfer12@yahoo.com
	</email>
</Client>
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			1912 Koch Lane
		</street>
		<city>
			San Jose
		</city>
		<state>
			CA
		</state>
		<zip>
			95125
		</zip>
	</Address>
	<phone>
		<cell>
			4085430091
		</cell>
	</phone>
	<email>
		beatlesfan36@hotmail.com
	</email>
	<email>
		lennonfan36@hotmail.com
	</email>
</Client>
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			4209 El Camino Real
		</street>
		<city>
			Mountain View
		</city>
		<state>
			CA
		</state>
		<zip>
			95033
		</zip>
	</Address>
	<phone>
		<home>
			6503310091
		</home>
	</phone>
</Client>

En caso de que usted sea curioso(a), también puede usar SQL plano para recuperar el conjunto completo de documentos SQL contenidos en la columna contactinfo . El enunciado simple "select contactinfo from client" lo hará.

Recuperando elementos XML específicos

Con frecuencia, los usuarios desean recuperar elementos específicos de documentos XML. Hacer esto con XQuery es bastante simple. Imagine que usted desea recuperar números de fax de todos los clientes que hayan suministrado esta información. Esta es una forma de escribir esa consulta:

Listado 14. Expresión FLWOR para recuperar datos de fax de clientes
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax
return $y

La primera línea le da la instrucción a DB2 para que invoque su analizador XQuery. La siguiente línea le dice a DB2 que itere por todos los sub-elementos de fax de los elementos Client contenidos en la columna CLIENTS.CONTACTINFO. Ca da elemento de fax está vinculado a su vez con una variable $y. La tercer línea indica que, por cada iteración se re torna el valor de $y. El resultado es una secuencia de elementos XML, como se muestra a continuación.

Listado 15. Resultado de muestra para la consulta anterior
<fax>4087776666</fax>
<fax>4085555555</fax>

El resultado mostrado está algo simplificado. La información de versión XML ha sido retirada porque no es importante para este tutorial. No obstante, las XQueries que usted ejecute en DB2 retornarán tal información. Consulte Listado 13 para ver un ejemplo).

LA consulta mostrada en el Listado 14 también podría expresarse como una expresión de ruta en tres pasos:

Listado 16. Expresión de ruta para recuperar datos de fax de cliente
xquery 
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax

En Fundamentos de XQuery usted aprendió sobre nodos de texto. Vamos a aplicar ese conocimiento aquí. Imagine que usted no desea obtener fragmentos XML de su consulta, sino que en lugar de ello simplemente desea una representación de texto se valores de elementos XML que califiquen. Para hacer esto, usted puede invocar la función text() en su cláusula return :

Listado 17. Dos consultas para recuperar representación de texto de datos de fax de cliente
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax
return $y/text()

(or)

xquery
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax/text()

El resultado de estas consultas es:

Listado 18. Resultado de muestra de las consultas anteriores
4087776666
4085555555

Los resultados de las consultas anteriores en esta sección son relativamente simples porque ambos incluyen el elemento fax, que se basa en un tipo de datos primitivo. Desde luego, los elementos pueden estar basados en tipos complejos, conteniendo sub-elementos (o jerarquías anidadas). El elemento Address de nuestra información de contacto de cliente es un ejemplo de esto. Considere lo que retornará la siguiente XQuery:

Listado 19. XQueries para recuperar XML de tipo complejo
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address
return $y

(or) 

xquery
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address

Si usted adivinó una secuencia de fragmentos XML conteniendo elementos Address y todos sus sub-elementos, estuvo en lo correcto. Aquí hay un extracto del resultado:

Listado 20. Resultado parcial de la consulta anterior
<Address>
  <street>5401 Julio Ave.</street>
  <city>San Jose</city>
  <state>CA</state>
  <zip>95116</zip>
</Address>
<Address>
  <street>1204 Meridian Ave.</street>
  <apt>4A</apt>
  <city>San Jose</city>
  <state>CA</state>
  <zip>95124</zip>
</Address>
<Address>
   <street>9407 Los Gatos Blvd.</street>
   <city>Los Gatos</city>
   <state>CA</state>
   <zip>95032</zip>
</Address>
	
. . .

Consultas que filtran valores de elemento XML

A menudo los usuarios desean especificar criterios de filtro basados en XML en sus XQueries. Y eso es fácil de hacer. En esta sección usted verá cómo hacer que algunos de los ejemplos XQuery previos sean más selectivos.

Especificando un predicado de filtrado individual

Vamos a empezar explorando cómo retornar las direcciones de correspondencia de todos los clientes que vivan en la zona con código postal 95116. Usted puede incorporar una cláusula where a su XQuery para filtrar resultados basados en el valor del elemento zip de los documentos XML de muestra almacenados en DB2. Para añadir una cláusula where a la expresión FLWOR del Listado 19 para obtener solo las direcciones de interés:

Listado 21. Expresión FLWOR con una nueva cláusula "where"
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address
where $y/zip="95116"
return $y

La cláusula where añadida es bastante simple. La cláusula for vincula la variable $y a cada dirección de turno. La cláusula where contiene una expresión de ruta corta que navega desde cada una de las direcciones hacia su elemento zip anidado. La cláusula where es verdadera (y la dirección es retenida) solo si el valor de este elemento zip es igual a 95116.

Como solo un cliente vive en el código zip objetivo, el resultado retornado es:

Listado 22. Resultado de la consulta anterior
<Address>
  <street>5401 Julio Ave.</street>
  <city>San Jose</city>
  <state>CA</state>
  <zip>95116</zip>
</Address>

El mismo resultado podría obtenerse añadiendo un predicado a la expresión de ruta, como sigue:

Listado 23. Expresión de ruta con predicado de filtro
xquery
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address[zip="95116"]

Especificando múltiples predicados de filtrado

Desde luego, usted puede filtrar sus valores de código zip y retornar elementos no relacionados con direcciones de correspondencia. Usted también puede filtrar sobre múltiples valores de elementos SQL en una sola consulta. La siguiente consulta retorna información de email de clientes que vivan en cualquier lugar de la ciudad de San José o en el código zip 95032 (que es un código postal en Los Gatos, California).

Listado 24. Filtrado sobre múltiples valores de elementos XML con una expresión FLWOR
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address/zip="95032" or $y/Address/city="San Jose"
return $y/email

Este ejemplo cambia la cláusula for de forma que vincula la variable $y con elementos Client en lugar de con elementos Address. Esto le permite filtrar los elementos Client por una parte del sub-árbol (Address) y retornar otra parte del sub-árbol (email). Las expresiones de ruta en la cláusula where y la cláusula return deben ser escritas con relación al elemento que está vinculado a la variable, $y).

La misma consulta podría expresarse de forma un poco más concisa como una expresión de ruta:

Listado 25. Filtrado sobre múltiples valores de elementos XML con una expresión de ruta
xquery 
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client[Address/zip="95032"  
or Address/city="San Jose"]/email;

Dados los datos de muestra de la tabla de clientes, es el resultado de cualquiera de estas dos consultas previas es:

Listado 26. Resultado de consulta
<email>
	love2shop@yahoo.com
</email>
<email>
	beatlesfan36@hotmail.com
</email>
<email>
	lennonfan36@hotmail.com
</email>

Un ejemplo práctico de las diferencias entre XQuery y SQL

Si usted inspecciona el resultado de consulta del Listado 26, encontrará que los resultados retornados difieren de dos formas significativas a lo que esperaría el programador SQL:

  • No se retornan datos XML de clientes que califican que no proporcionaron su dirección de e-mail.

    Dados nuestros datos de muestra, cuatro clientes cumplen con nuestros criterios de selección de consulta (todos viven en San José o su código zip e 95032), aún así este hecho no se refleja en los resultados de consulta. ¿Por qué? Los elementos de e-mail están ausentes de los registros de dos de estos clientes. Desde que XQuery no utilice nulos, la información "faltante" no se refleja en los resultados.

  • El resultado no indica que las direcciones de e-mail se hubieran derivado del mismo documento XML.

    Una mirada de cerca a los datos de muestra indica que las dos direcciones de e-mail finales mostradas en elListado 26 están contenidas en un documento XML (es decir, que pertenecen a un cliente). Esto no es obvio desde el resultado.

Amabas situaciones pueden ser deseables bajo ciertas circunstancias y no deseables bajo otras. Por ejemplo, si usted desea enviar un e-mail a cada cuenta que califique en el registro, entonces iterar por una lista de direcciones de e-mail de los clientes en formato XML será fácil de hacer en una aplicación. Sin embargo, si usted desea enviar por correo solo una notificación a cada cliente (incluyendo aquellos que solo lo suministraron su dirección física) entonces la XQueries mostrada anteriormente no será suficiente.

Existen múltiples formas en la que usted puede reescribir las consultas anteriores para que los resultados retornados representen la información faltante de alguna manera, para que indiquen cuando se deriven múltiples direcciones de e-mail del mismo registro de cliente (esto es, el mismo documento XML). Usted aprenderá cómo hacerlo un poco más adelante en este tutorial. No obstante, si desea recuperar una lista que contenga una lista de e-mail por cada cliente que califique, podría modificar ligeramente las anteriores consultas:

Listado 27. Retornando el primer elemento de e-mail de clientes que califican
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address/zip="95032" or $y/Address/city="San Jose"
return $y/email[1]

(or)

xquery 
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client[Address/zip="95032"  
or Address/city="San Jose"]/email[1];

Estas dos consultas dan la instrucción al DB2 de que retorne el primer elemento de email que encuentre dentro de cada documento XML que califique (registro de contrato con el cliente). Si no encuentra una dirección de email para un cliente que califique, esta no retornará nada para ese cliente. Por lo tanto, estas dos consultas producirán este resultado:

Listado 28. Resultado de consulta
<email>
	love2shop@yahoo.com
</email>
<email>
	beatlesfan36@hotmail.com
</email>

Transformaciones de datos XML

Un poderoso aspecto de XQuery es su capacidad para transformar datos XML de una forma XML a otra. En esta sección usted aprenderá cuán fácil es hacerlo.

Convirtiendo XML en HTML

En las aplicaciones basadas en web, es común convertir la totalidad o parte de documentos XML en HTML para mostrarlos fácilmente. Con XQuery, este es un proceso muy simple. Considere la siguiente consulta, la cual recupera direcciones de los clientes, ordena los resultados por código postal y convierte el resultado en elementos XML que hacen parte de una lista HTML no ordenada:

Listado 29. Consultando datos DB2 XML y retornando resultados como HTML
xquery 
<ul> {
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address
order by $y/zip
return <li>{$y}</li> 
} </ul>

La consulta comienza lo suficientemente simple con la palabra clave xquery para indicarle al analizador DB2 que XQuery está siendo usado como lenguaje principal. La segunda línea hace que la marcación HTML para una lista no ordenada (<ul>) sea incluida en los resultados. También introduce un corchete, el primero de dos conjuntos utilizados en esta consulta. Los corchetes instruyen al DB2 para que evalúe y procese la expresión encerrada en lugar de tratarla como una cadena de caracteres literal.

La tercera línea itera sobre las direcciones de clientes, vinculando la variable $y a cada elemento de dirección de turno. La cuarta línea incluye una cláusula order by , especificando que los resultados deben retornarse en orden ascendente (el orden predeterminado), con base de los códigos postales de los clientes (el sub-elemento zip de cada Address vinculada a $y). La cláusula return indica que los elementos Address estarán rodeados por etiquetas de elemento de lista HTML antes de retornar. Y la línea final concluye la consulta y completa la etiqueta de lista HTML no ordenada.

Una porción del resultado de salida de esta consulta es:

Listado 30. Resultado HTML de la consulta previa
<ul>
  <li>
     <Address>
         <street>9407 Los Gatos Blvd.</street>
         <city>Los Gatos</city>
         <state>CA</state>
         <zip>95032</zip>
     </Address>
  </li>
  <li>
     <Address>
         <street>4209 El Camino Real</street>
         <city>Mountain View</city>
         <state>CA</state>
        <zip>95033</zip>
     </Address>
  </li>
. . . 
</ul>

Usando transformaciones para señalar elementos faltantes o repetidos en documentos XML

Consideremos un tema que surgió anteriormente: cómo escribir una XQuery que señale valores perdidos en los resultados retornados, y que indique cuando un documento XML individual (como un registro de cliente individual) contiene elementos repetidos, como múltiples direcciones de e-mail. Una forma de hacerlo es empaquetando el resultado retornado en un nuevo elemento XML, como se muestra en la siguiente consulta:

Listado 31. Indicando valores faltantes y elementos repetidos en un resultado XQuery
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address[zip="95032"] or $y/Address[city="San Jose"]
return <emailList> {$y/email} </emailList>

Ejecutar esta consulta hace que se retorne una secuencia de elementos emailList, una por cada registro de cliente que califique. Cada elemento emailList contendrá datos de e-mail. Si DB2 encuentra una sola dirección de e-mail en el registro de un cliente, retornará ese elemento y su valor. Si encuentra múltiples direcciones de e-mail, retornará todos los elementos de e-mail y sus valores. Finalmente, si no encuentra direcciones de e-mail, retornará un elemento emailList vacío.

Dados nuestros datos de muestra, el resultado de esta consulta es:

Listado 32. Resultado de la consulta anterior
<emailList>
   <email>love2shop@yahoo.com</email>
</emailList>
<emailList/>
<emailList/>
<emailList>
   <email>beatlesfan36@hotmail.com</email>
   <email>lennonfan36@hotmail.com<emailList>
</emailList>

Lógica condicional

Usted puede incorporar lógica condicional en sus XQueries usando algunas palabras clave simples.

Imagine que le gustaría contactar a cada uno de sus clientes. Usted preferiría contactarlos por e-mail, pero si no tiene una dirección de e-mail, entonces tendrá que llamarlos por teléfono a sus casas. Si tampoco tiene los números telefónicos de sus casas, entonces querrá enviarles una carta por coreo físico. Así, necesitará consultar su tabla de clientes DB2 y armar una lista de contactos que pueda contener una sola dirección de correo, número telefónico de la casa, o dirección de correo postal de cada uno de sus clientes.

Esta es una tarea fácil de lograr si usted incorpora lógica condicional a su XQuery. Esta es una forma en la que puede obtener la información necesaria:

Listado 33. XQuery con una expresión condicional en tres partes
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client 
return ( 
  if ($y/email) then $y/email[1] 
  else if ($y/phone/home) then <homePhone>{$y/phone/home/text()}</homePhone>
  else $y/Address)

Observemos las líneas de la 4 a la 6 de esta consulta. Como puede ver, estas son parte de la cláusula return y determinan el resultado de la consulta.

La línea 4 comprueba si hay al menos un elemento de e-mail presente en el documento; si lo hay, especifica que se retorne el primer elemento de email. Si no hay elementos presentes, se ejecuta la Línea 5. Esta le dice al DB2 que intente localizar un elemento home debajo del elemento phone. Si el documento incluye un número telefónico de la casa, este nodo de texto se extrae y se retorna como parte de un nuevo elemento "homePhone". Finalmente, si no hay un elemento de dirección de e-mail ni de teléfono de la casa en el perfil del cliente (documento XML), DB2 retorna el elemento Address completo. Como todos los registros de la tabla de cliente incluyen una dirección física, la lógica de esta consulta garantiza que el DB2 retornará un medio de contactar al cliente.

El resultado de esta consulta es:

Listado 34. Resultado de consulta
<email>
	love2shop@yahoo.com
</email>

<Address>
	<street>
		1204 Meridian Ave.
	</street>
	<apt>
		4A
	</apt>
	<city>
		San Jose
	</city>
	<state>
		CA
	</state>
	<zip>
		95124
	</zip>
</Address>

<homePhone>
	4083332222
</homePhone>

<email>
	golfer12@yahoo.com
</email>

<email>
	beatlesfan36@hotmail.com
</email>

<homePhone>
	6503310091
</homePhone>

Consultas "Híbridas"

Usted ha visto cómo escribir XQueries que recuperen fragmentos de documentos XML, que creen nuevas formas de resultados XML, y que retornen diferentes resultados con base en condiciones especificadas en las consultas mismas. Estas son algunas formas simples de consultar datos XML almacenados en DB2.

Para asegurarse, hay más para aprender sobre XQuery de lo que se incluye en este tutorial. Pero hay un tema amplio que no podemos olvidar: cómo escribir consultas que incluyan expresiones tanto SQL como XQuery. Hacer esto puede ser útil si usted necesita escribir consultas que filtren datos con base en valores de columna XML y no XML.

Como este tutorial se enfoca en XQuery y este se utiliza como lenguaje de nivel superior, primero exploraremos cómo incorporar SQL en XQueries. Sin embargo, es importante señalar que usted también puede hacer lo opuesto, puede incorporar XQueries en SQL. Usted también verá un breve ejemplo de cómo hacerlo al final de este tutorial. Además, si desea más información sobre SQL/XML y sobre cómo incorporar XQueries en SQL, vea Recursos.

Incorporando SQL en XQueries

Para incorporar SQL en una XQuery, usted usa la función db2-fn:sqlquery en lugar de la funcióndb2-fn:xmlcolumn . La función db2-fn:sqlquery ejecuta una consulta SQL y solo retorna los datos seleccionados. La consulta SQL pasada a db2-fn:sqlquery solo debe retornar datos XML; esto permite que XQuery procese adicionalmente el resultado de la consulta SQL.

Usemos un ejemplo que incorpora muchos conceptos que ya hemos cubierto. Imagine que desea una lista de todas las direcciones de e-mail de clientes Gold que vivan en San José. Si un cliente tiene múltiples direcciones de e-mail, usted querrá que todas se incluyan en el resultado como parte de un registro individual. Finalmente, si un cliente Gold que califica no proporciona una dirección de email, usted puede recuperar su dirección de correo postal. Esta es una forma de escribir esa consulta:

Listado 35. Incorporando SQL dentro de una XQuery que incluye lógica condicional
xquery 
for $y in 
db2-fn:sqlquery('select contactinfo from clients where status=''Gold'' ')/Client
where $y/Address/city="San Jose"
return (
     if ($y/email) then <emailList>{$y/email}</emailList>
     else $y/Address   
)

Enfoquémonos en la tercera línea, la cual incorpora un enunciado SQL. El enunciado SELECT contiene un predicado de consulta basado en la columna status , comparando el valor de esta columna VARCHAR con la cadena de caracteres Gold. En SQL, tales secuencias están rodeadas por comillas individuales. Aun que en el ejemplo pueda parecer que se usan comillas dobles, en realidad usa dos comillas individuales antes y después del valor de comparación (''Gold''). Las comillas individuales "adicionales" son caracteres de escape. Si usted usa comillas dobles alrededor de su predicado de consulta pasado en cadena de caracteres en lugar de pares de comillas individuales, obtendrá un error de sintaxis.

El resultado de esta consulta es:

Listado 36. Resultado de consulta
<emailList>
	<email>
		love2shop@yahoo.com
	</email>

<Address>
	<street>
		1204 Meridian Ave.
	</street>
	<apt>	4A
	</apt>
	<city>
		San Jose
	</city>
	<state>
		CA
	</state>
	<zip>
		95124
	</zip>
</Address>

Incorporando XQueries en SQL

Es importante entender que usted también puede incorporar XQueries en SQL. De hecho, el DB2 9 incluye soporte para funciones estándar SQL/XML que se usan frecuentemente para formular consultas híbridas en las que SQL es el lenguaje más externo (o de nivel superior). Aunque esto está más allá del ámbito de este tutorial, para tratar en detalle el soporte de SQL/XML del DB2, vale la pena señalar por lo menos dos funciones en particular:

XMLExists
Le permite navegar hacia un elemento (u otro tipo de nodo) dentro de su documento XML y probarlo para una condición específica. Cuando se especifica como parte de la cláusula WHERE SQL, XMLExists restringe los resultados retornados a solo aquellas filas que contienen un documento XML que satisface su condición especificada (donde la condición especificada evalúa para "true"). Como usted tal vez puede sospechar, usted pasa una expresión XQuery como entrada a la función XMLExists para navegar hacia el nodo de interés en su documento.
XMLQuery
Vamos a proyectar XML en el conjunto de resultados SQL retornados por su consulta SQL/XML. Es comúnmente usado recuperar uno o más elementos de documentos XML. De nuevo, como tal vez se pueda imaginar, la función XMLQuery toma una expresión XQuery como una entrada.

Considere la siguiente consulta, la cual usa SQL como el lenguaje de nivel superior y que incluye llamados a las funciones XMLQuery y en el XMLExists :

Listado 37. Incorporando expresiones de ruta XQuery en SQL para proyectar y restringir datos XML
select name, status,
xmlquery('$c/Client/phone/home' passing contactinfo as "c")
from clients
where xmlexists('$y/Client/Address[zip="95032"]' passing contactinfo as "y")

Esta consulta retorna un conjunto con columnas para el nombre del cliente, el estado y el número telefónico de la casa. Las primeras dos columnas contienen datos SQL VARCHAR y la tercera columna contiene un elemento XML extraído de documentos XML que califican. Consideremos las líneas 2 y 4 de esta consulta más de cerca.

La línea 2 invoca XMLQuery como parte de la cláusula SELECT , señalando que el resultado retornado por esta función debe incluirse como una columna en el conjunto de resultados SQL. Como entrada para esta función, especificamos una expresión de ruta XQuery que hace que DB2 navegue hacia el sub-elemento phone directamente, por debajo del elemento Client. La expresión de ruta referencia una variable ($c), que hemos declarado para que se refiera a la columna contactinfo.

La línea 4 invoca XMLExists con una cláusula SQL WHERE , indicando que DB2 debe restringir los resultados basados en un predicado XML. Este predicado se especifica en la expresión de ruta (esta señala que solo estamos interesados en clientes que vivan en un código de área específico). De nuevo, notará que la expresión de ruta proporcionada como entrada a esta función SQL/XML define una variable ($y, en este caso) que identifica dónde encontrará DB2 los documentos XML de interés (en la columna contactinfo).

Dados nuestros datos de muestra, el resultado de esta consulta es un conjunto de resultados de una sola fila con los siguientes valores:

Listado 38. Resultado de consulta
Lisa Hansen         Silver    <home>4083332222</home>

Para más información sobre el soporte de SQL/XML del DB2, vea Recursos.


Resumen

Este tutorial le introdujo al soporte de XQuery del DB2, y explicó diversos conceptos básicos de lenguaje. Usted aprendió como escribir y ejecutar XQueries simples contra datos XML almacenados en DB2.

Para seguir esta serie, añada un marcador a esta página, serie de tutoriales de preparación para el examen 730 Fundamentos DB2 9.

Recursos

Aprender

Obtener los productos y tecnologías

  • Una versión de prueba del DB2 9 está disponible para descarga.
  • Descargue DB2 Express-C, una versión gratuita del DB2 Express Edition para la comunidad que ofrece los mismos recursos de datos principales que el DB2 Express Edition y proporciona una base sólida para construir e implementar aplicaciones.

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Information mgmt
ArticleID=793866
ArticleTitle=Preparación para el examen 730 Fundamentos DB2 9, Parte 7: Presentando XQuery
publish-date=02162012