base de datos programación sql xml - ibm.com · funciones de publicación de sql/xml para...

250
IBM i Versión 7.2 Base de datos Programación SQL XML

Upload: phungthien

Post on 19-Sep-2018

236 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

IBM iVersión 7.2

Base de datosProgramación SQL XML

���

Page 2: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola
Page 3: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

IBM iVersión 7.2

Base de datosProgramación SQL XML

���

Page 4: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

AvisoAntes de utilizar esta información y el producto al que da soporte, lea la información contenida en “Avisos” en la página231.

Esta edición se aplica a IBM i 7.1 (producto número 5770-SS1) y a todos los releases y modificaciones subsiguienteshasta que se indique lo contrario en nuevas ediciones. Esta versión no se ejecuta en todos los modelos de sistemacon conjunto reducido de instrucciones (RISC) ni tampoco se ejecutan en los modelos CISC.

Este documento puede contener referencias al código interno bajo licencia. El código interno bajo licencia (LIC) escódigo máquina y se licencia bajo los términos del Acuerdo de licencia de IBM para Código máquina.

© Copyright IBM Corporation 2012, 2014.

Page 5: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Contenido

Programación SQL XML . . . . . . . . 1Novedades de IBM i 7.2 . . . . . . . . . . 1Cómo leer los diagramas de sintaxis . . . . . . 1Archivo PDF de Programación SQL XML . . . . . 3Sentencias SQL y funciones SQL/XML . . . . . 3

Visión general de la entrada y salida XML . . . 4Comparación entre XML y los modelosrelacionales . . . . . . . . . . . . . . 5Guía de aprendizaje de XML . . . . . . . . 7

Ejercicio 1: Crear una tabla que puedealmacenar datos XML . . . . . . . . . 7Ejercicio 2: Insertar documentos XML encolumnas de tipo XML . . . . . . . . . 7Ejercicio 3: Actualizar documentos XMLalmacenados en una columna XML . . . . . 8Ejercicio 4: Validar documentos XML conrespecto a esquemas XML . . . . . . . . 9Ejercicio 5: Transformación con hojas de estiloXSLT . . . . . . . . . . . . . . 11

Inserción de datos XML . . . . . . . . . 14Adición de columnas XML a tablas existentes 14Inserción en columnas XML . . . . . . . 14Análisis XML. . . . . . . . . . . . 15

Funciones de publicación de SQL/XML paraconstruir valores XML . . . . . . . . . . 17

Ejemplo: Construir un documento XML convalores de una sola tabla . . . . . . . . 18Ejemplo: Construir un documento XML convalores de varias tablas . . . . . . . . 19Ejemplo: Construir un documento XML conlos valores de filas de tabla que contienenelementos nulos . . . . . . . . . . . 19Ejemplo: Transformación con hojas de estiloXSLT . . . . . . . . . . . . . . 20Ejemplo: Utilización de XSLT como motor deformato. . . . . . . . . . . . . . 22Ejemplo: Utilización de XSLT para elintercambio de datos . . . . . . . . . 23Ejemplo: Utilización de XSLT para eliminarespacios de nombres . . . . . . . . . 25Consideraciones importantes para latransformación de documentos XML . . . . 28Manejo de caracteres especiales en funcionesde publicación de SQL/XML . . . . . . 28Serialización de XML . . . . . . . . . 29Diferencias en un documento XML tras elalmacenamiento y recuperación. . . . . . 31Tipos de datos para el archivado dedocumentos XML . . . . . . . . . . 31

Utilización de XMLTABLE para hacer referenciaal contenido XML como una tabla relacional . . 32

Ejemplo: Utilizar XMLTABLE para manejarelementos que faltan . . . . . . . . . 33Ejemplo: Utilizar XMLTABLE para crear unsubconjunto de datos de resultado. . . . . 34

Ejemplo: Utilizar XMLTABLE para manejarvarios valores. . . . . . . . . . . . 34Ejemplo: Utilizar XMLTABLE con espacios denombres . . . . . . . . . . . . . 36Ejemplo: Numerar filas de resultados paraXMLTABLE . . . . . . . . . . . . 39

Actualización de datos XML. . . . . . . . 39Supresión de datos XML de tablas . . . . . 40

Repositorio de esquemas XML . . . . . . . 40Soporte de lenguajes de programación deaplicaciones . . . . . . . . . . . . . 41

Inserciones y actualizaciones de columnasXML en aplicaciones CLI . . . . . . . . 42Recuperación de datos XML en aplicacionesCLI . . . . . . . . . . . . . . . 43Declaración de variables del lenguaje principalXML en aplicaciones de SQL incorporado . . 44

Ejemplo: Cómo hacer referencia a variableshost XML en aplicaciones de SQLincorporado . . . . . . . . . . . 45Recomendaciones para el desarrollo deaplicaciones de SQL incorporado con XML . 46Identificación de valores XML en unSQLDA. . . . . . . . . . . . . 46

Java . . . . . . . . . . . . . . . 46Datos XML en aplicaciones JDBC . . . . 46Datos XML en aplicaciones SQLJ . . . . 52

Rutinas . . . . . . . . . . . . . . 55Soporte de XML en procedimientos SQL. . 55Soporte para el tipo de datos XML enrutinas externas . . . . . . . . . . 56

Codificación de datos XML . . . . . . . . 60Consideraciones sobre codificación alalmacenar o pasar datos XML . . . . . . 60

Consideraciones de codificación para laentrada de datos XML en una base dedatos . . . . . . . . . . . . . 60Consideraciones de codificación para larecuperación de datos XML de una base dedatos . . . . . . . . . . . . . 60Consideraciones de codificación para pasardatos XML en parámetros de rutinas . . . 61Consideraciones de codificación para datosXML en aplicaciones JDBC y SQLJ. . . . 61

Efectos de la codificación y serialización XMLsobre la conversión de datos. . . . . . . 61

Escenarios de codificación para la entradade datos XML codificados internamente enuna base de datos . . . . . . . . . 62Escenarios de codificación para la entradade datos XML codificados externamente enuna base de datos . . . . . . . . . 63Escenarios de codificación para larecuperación de datos XML conserialización implícita . . . . . . . . 65

© Copyright IBM Corp. 2012, 2014 iii

Page 6: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Escenarios de codificación para larecuperación de datos XML conXMLSERIALIZE explícita . . . . . . . 68

Correlaciones de nombres de codificación conlos CCSID efectivos para datos XMLalmacenados . . . . . . . . . . . . 70Correlaciones de CCSID con nombres decodificación para datos de salida XMLserializados . . . . . . . . . . . . 70

Descomposición de esquemas XML anotados . . . 70Descomposición de documentos XML conesquemas XML anotados . . . . . . . . . 71Registro y habilitación de esquemas XML para ladescomposición . . . . . . . . . . . . 71Orígenes de descomposición de esquemas XMLanotados . . . . . . . . . . . . . . 71anotaciones de descomposición XML . . . . . 72

Especificación y ámbito de las anotaciones dedescomposición XML . . . . . . . . . 72Anotaciones como atributos . . . . . . . 73Anotaciones como elementos hijoestructurados . . . . . . . . . . . . 73Anotaciones globales . . . . . . . . . 73Anotaciones de descomposición XML -Resumen . . . . . . . . . . . . . 73Anotación de descomposicióndb2-xdb:defaultSQLSchema . . . . . . . 74Anotación de descomposición db2-xdb:rowSet 75Anotación de descomposición db2-xdb:table 80Anotación de descomposición db2-xdb:column 82Anotación de descomposicióndb2-xdb:locationPath . . . . . . . . . 84Anotación de descomposicióndb2-xdb:expression . . . . . . . . . . 87Anotación de descomposicióndb2-xdb:condition . . . . . . . . . . 90Anotación de descomposicióndb2-xdb:contentHandling . . . . . . . . 93Anotación de descomposicióndb2-xdb:normalization. . . . . . . . . 97Anotación de descomposición db2-xdb:order 99Anotación de descomposicióndb2-xdb:truncate . . . . . . . . . . 101Anotación de descomposicióndb2-xdb:rowSetMapping . . . . . . . 103Anotación de descomposicióndb2-xdb:rowSetOperationOrder . . . . . 105Palabras clave para la descomposición deesquemas XML anotados . . . . . . . 106

Tratamiento de las secciones CDATA en ladescomposición del esquema XML anotado . . 107Valores NULL y series vacías en ladescomposición de esquemas XML anotados . . 107Lista de comprobación para la descomposiciónde esquemas XML anotados . . . . . . . 108Ejemplos de correlaciones en la descomposiciónde esquemas XML anotados . . . . . . . 109

Anotaciones de tipos complejos derivados 109Ejemplo de anotación de descomposición:Correlación con una columna XML . . . . 115

Ejemplo de anotación de descomposición: Unvalor correlacionado con una sola tabla quegenera una sola fila . . . . . . . . . 116Ejemplo de anotación de descomposición: Unvalor correlacionado con una sola tabla quegenera varias filas . . . . . . . . . . 118Ejemplo de anotación de descomposición: Unvalor correlacionado con varias tablas . . . 119Ejemplo de anotación de descomposición:Agrupación de varios valores correlacionadoscon una sola tabla . . . . . . . . . . 121Ejemplo de anotación de descomposición:Varios valores de contextos diferentescorrelacionados con una sola tabla . . . . 123Compatibilidad de tipos de esquema XMLcon tipos SQL para la descomposición deesquemas anotados . . . . . . . . . 124Límites y restricciones para ladescomposición de esquemas XML anotados . 131Esquema para las anotaciones dedescomposición XML. . . . . . . . . 132

Modelo de datos XML . . . . . . . . . . 133Secuencias y elementos . . . . . . . . . 133Valores atómicos . . . . . . . . . . . 134Nodos . . . . . . . . . . . . . . . 134

Nodos de documento. . . . . . . . . 135Nodos de elemento . . . . . . . . . 136Nodos de atributo . . . . . . . . . . 138Nodos de texto . . . . . . . . . . . 138Nodos de instrucción de proceso . . . . . 139Nodos de comentario. . . . . . . . . 139

Generación de modelos de datos . . . . . . 140Valores XML en SQL . . . . . . . . . . 141

Visión general de XPath . . . . . . . . . . 142Sensibilidad a las mayúsculas y minúsculas enDB2 XPath . . . . . . . . . . . . . 144Espacios en blanco en DB2 XPath . . . . . 144Comentarios en DB2 XPath . . . . . . . . 145Juego de caracteres . . . . . . . . . . 145Ordenación predeterminada . . . . . . . 145Espacios de nombres XML y nombrescalificados en DB2 XPath . . . . . . . . 146Sistema de tipos de XPath . . . . . . . . 147

Visión general del sistema de tipos . . . . 147Funciones de constructor para tiposincorporados . . . . . . . . . . . 147Tipos de datos genéricos . . . . . . . 148

xs:anyType . . . . . . . . . . . 148xs:anySimpleType . . . . . . . . . 148xs:anyAtomicType . . . . . . . . . 148

Tipos de datos para datos sin tipo . . . . 148xs:untyped . . . . . . . . . . . 148xs:untypedAtomic . . . . . . . . . 149

xs:string . . . . . . . . . . . . . 149Tipos de datos numéricos . . . . . . . 149

xs:decimal . . . . . . . . . . . 149xs:double . . . . . . . . . . . . 150xs:integer . . . . . . . . . . . . 150Límites de rango para tipos numéricos 151

xs:boolean . . . . . . . . . . . . 151Tipos de datos de fecha y hora . . . . . 152

iv IBM i: Programación SQL XML

Page 7: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

xs:date . . . . . . . . . . . . 152xs:time . . . . . . . . . . . . 152xs:dateTime . . . . . . . . . . . 153xs:duration . . . . . . . . . . . 154xs:dayTimeDuration . . . . . . . . 156xs:yearMonthDuration . . . . . . . 157

Conversiones entre tipos de datos deesquema XML . . . . . . . . . . . 158

Expresiones y prólogos XPath . . . . . . . 160Prólogos . . . . . . . . . . . . . 161

Declaraciones de espacio de nombres . . 161Declaraciones de espacio de nombrespredeterminado . . . . . . . . . 162

Evaluación y proceso de expresiones . . . 163Atomización. . . . . . . . . . . 163Promoción de tipo. . . . . . . . . 163Sustitución de subtipo . . . . . . . 164

Expresiones primarias . . . . . . . . 164Literales . . . . . . . . . . . . 164Referencias de variable en DB2 XPath . . 165Expresión entre paréntesis . . . . . . 166Expresiones de elemento de contexto . . 166Llamadas de función . . . . . . . . 167

Expresiones de vía de acceso . . . . . . 167Pasos de eje . . . . . . . . . . . 168Sintaxis abreviada para expresiones de víade acceso . . . . . . . . . . . . 174

Expresiones de filtro . . . . . . . . . 175Expresiones aritméticas . . . . . . . . 175Expresiones de comparación . . . . . . 178

Comparaciones genéricas . . . . . . 178Expresiones lógicas . . . . . . . . . 179Expresiones regulares. . . . . . . . . 180

Descripciones de funciones XPath . . . . . 183Función fn:abs . . . . . . . . . . . 187Función fn:adjust-date-to-timezone . . . . 188Función fn:adjust-dateTime-to-timezone . . 189Función fn:adjust-time-to-timezone . . . . 191Función fn:boolean . . . . . . . . . 192Función fn:compare . . . . . . . . . 193Función fn:concat . . . . . . . . . . 194Función fn:contains . . . . . . . . . 194Función fn:count . . . . . . . . . . 195Función fn:current-date . . . . . . . . 195Función fn:current-dateTime . . . . . . 196Función db2-fn:current-local-date . . . . . 196Función db2-fn:current-local-dateTime . . . 196Función db2-fn:current-local-time. . . . . 197Función fn:current-time . . . . . . . . 197Función fn:data. . . . . . . . . . . 198Función fn:dateTime . . . . . . . . . 198Función fn:day-from-date . . . . . . . 199

Función fn:day-from-dateTime. . . . . . 199Función fn:days-from-duration . . . . . 200Función fn:distinct-values . . . . . . . 200Función fn:exists . . . . . . . . . . 201Función fn:hours-from-dateTime . . . . . 202Función fn:hours-from-duration . . . . . 202Función fn:hours-from-time . . . . . . 203Función fn:implicit-timezone . . . . . . 203Función fn:last . . . . . . . . . . . 204Función fn:local-name . . . . . . . . 205Función db2-fn:local-timezone . . . . . . 206Función fn:lower-case . . . . . . . . 206Función fn:matches . . . . . . . . . 207Función fn:max. . . . . . . . . . . 208Función fn:min . . . . . . . . . . . 209Función fn:minutes-from-dateTime . . . . 210Función fn:minutes-from-duration . . . . 210Función fn:minutes-from-time . . . . . . 211Función fn:month-from-date . . . . . . 212Función fn:month-from-dateTime . . . . . 212Función fn:months-from-duration . . . . 213Función fn:name . . . . . . . . . . 213Función fn:normalize-space. . . . . . . 215Función fn:not . . . . . . . . . . . 215Función fn:position . . . . . . . . . 216Función fn:replace . . . . . . . . . . 217Función fn:round . . . . . . . . . . 218Función fn:seconds-from-dateTime . . . . 219Función fn:seconds-from-duration . . . . 219Función fn:seconds-from-time . . . . . . 220Función fn:starts-with . . . . . . . . 220Función fn:string . . . . . . . . . . 221Función fn:string-length . . . . . . . . 222Función fn:substring . . . . . . . . . 222Función fn:sum. . . . . . . . . . . 223Función fn:timezone-from-date . . . . . 223Función fn:timezone-from-dateTime . . . . 224Función fn:timezone-from-time . . . . . 225Función fn:tokenize . . . . . . . . . 225Función fn:translate . . . . . . . . . 227Función fn:upper-case . . . . . . . . 228Función fn:year-from-date . . . . . . . 228Función fn:year-from-dateTime . . . . . 229Función fn:years-from-duration . . . . . 229

Avisos . . . . . . . . . . . . . . 231Información de interfaz de programación . . . . 233Marcas registradas. . . . . . . . . . . . 233Términos y condiciones . . . . . . . . . . 233

Índice. . . . . . . . . . . . . . . 235

Contenido v

Page 8: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

vi IBM i: Programación SQL XML

Page 9: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Programación SQL XML

DB2 para IBM® i proporciona soporte para almacenar y recuperar datos XML utilizando el lenguaje deconsulta estructurado (SQL). Los objetos definidos mediante SQL, como por ejemplo tablas, funciones yprocedimientos, pueden utilizar el tipo de datos XML para definiciones de columna, parámetro yvariable. Además de un tipo de datos XML, existen funciones incorporadas y procedimientos que puedeutilizarse para generar documentos XML y recuperar la totalidad o parte de un documento XML.

Nota: Por el hecho de utilizar los ejemplos de código, acepta los términos de la “Información sobrelicencia de código y exención de responsabilidad” en la página 230.

Novedades de IBM i 7.2Conozca la información nueva o que ha cambiado sustancialmente en el temario de programación SQLXML.

La colección de temas de programación SQL XML es nueva. Incluye todas la información de XML queanteriormente se encontraba en el temario Programación SQL.

Cómo ver las novedades o los cambios realizados

Para facilitar la visualización de los cambios técnicos realizados, el centro de información utiliza:v La imagen , que señala dónde empieza la información nueva o cambiada.v La imagen para marcar el final de la información nueva o modificada.

En los archivos PDF, puede ver barras de revisión (|) en el margen izquierdo de la información nueva omodificada.

Para obtener otra información acerca de los cambios y novedades de este release, consulte elMemorándum para los usuarios.

Cómo leer los diagramas de sintaxisLos diagramas de sintaxis utilizados en este manual están sujetos a las normas siguientes.v Lea los diagramas de sintaxis de izquierda a derecha y de arriba abajo, siguiendo el recorrido de la

línea.El símbolo ��─── indica el principio del diagrama de sintaxis.El símbolo ---? indica que la sintaxis continúa en la línea siguiente.El símbolo �─── indica que la sintaxis continúa de la línea anterior.El símbolo ───�� indica el final del diagrama de sintaxis.Los diagramas de unidades sintácticas empiezan con el símbolo |─── y finalizan con el símbolo ───|.

v Los elementos obligatorios aparecen en la línea horizontal (la ruta principal).

�� elemento_obligatorio ��

v Los elementos opcionales se muestran debajo de la ruta principal.

�� elemento_obligatorioelemento_opcional

��

© Copyright IBM Corp. 2012, 2014 1

||

Page 10: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Si un elemento aparece encima de la ruta principal, ese elemento es opcional, no tiene ningún efectosobre la ejecución de la sentencia y se utiliza sólo a efectos de legibilidad.

�� elemento_obligatorioelemento_opcional

��

v Si puede elegirse más de un elemento, éstos aparecen verticalmente, en una pila.Si uno de los elementos debe elegirse, un elemento de la pila aparece en la ruta principal.

�� elemento_obligatorio opción_obligatoriaopción_obligatoria

��

Si la elección de uno de los elementos es opcional, toda la pila aparece debajo de la línea principal.

�� elemento_obligatorioopción_opcionalopción_opcional

��

Si uno de los elementos es el valor predeterminado, aparecerá encima de la ruta principal y lasopciones restantes se mostrarán debajo.

�� elemento_obligatorioopción_predeterminada

opción_opcionalopción_opcional

��

Si un elemento opcional tiene un valor predeterminado cuando no se especifica, el valorpredeterminado aparece encima de la ruta principal.

�� elemento_obligatorioopción_predeterminada

opción_opcional opción_obligatoriaopción_obligatoria

opción_opcional

��

v Una flecha que vuelve a la izquierda, sobre la línea principal, indica un elemento que se puede repetir.

�� elemento_obligatorio � elemento_repetible ��

Si la flecha de repetición contiene una coma, los elementos repetidos se deben separar mediante comas.

�� elemento_obligatorio �

,

elemento_repetible ��

Una flecha de repetición encima de una pila indica que los elementos de la pila se pueden repetir.v Las palabras clave aparecen en mayúsculas (por ejemplo FROM). Se deben escribir exactamente tal como

se muestran. Las variables aparecen completamente en minúsculas (por ejemplo, nombre-columna).Representan nombres o valores suministrados por el usuario.

v Si se muestran signos de puntuación, paréntesis, operadores aritméticos u otros símbolos de este tipo,debe especificarlos como parte de la sintaxis.

2 IBM i: Programación SQL XML

Page 11: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Archivo PDF de Programación SQL XMLPuede ver e imprimir un archivo PDF de esta información.

Para ver o descargar la versión PDF de este documento, seleccione Programación SQL XML.

Cómo guardar los archivos PDF

Para guardar un PDF en la estación de trabajo con el fin de verlo o imprimirlo:1. En el navegador, pulse el enlace al PDF con el botón derecho del ratón.2. Pulse la opción que guarda el PDF localmente.3. Navegue hasta el directorio en el que desee guardar el PDF.4. Pulse Guardar.

Cómo descargar Adobe Reader

Para poder ver o imprimir archivos PDF, debe instalar Adobe Reader en su sistema. Puede descargar una

copia gratuita desde el sitio Web de Adobe (http://get.adobe.com/reader/) .

Sentencias SQL y funciones SQL/XMLMuchas sentencias SQL admiten el tipo de datos XML. Esto permite realizar muchas operacionescomunes de base de datos con datos XML, como por ejemplo crear tablas con columnas XML, añadircolumnas XML a tablas existentes, crear desencadenantes en tablas con columnas XML e insertar,actualizar o suprimir documentos XML. Un conjunto de funciones, expresiones y especificaciones deSQL/XML soportadas por el servidor de bases de datos DB2 se beneficia plenamente del tipo de datosXML.

Tipo de datos XML

El tipo de datos XML puede almacenar un valor XML de hasta 2 GB. Puede especificarse un CCSID parael tipo de datos XML. Si no se especifica un CCSID, se utilizará el valor de la opción QAQQINISQL_XML_DATA_CCSID. El valor predeterminado para esta opción es 1208 (UTF-8). El tipo de datosXML puede almacenar caracteres de un solo byte y Unicode de doble byte.

Una sola fila de una tabla que contenga uno o más valores LOB o XML no puede superar los 3,5 GB. Eltipo de datos XML puede especificarse en una tabla particionada.

Pueden declararse variables de lenguaje principal XML y localizadores de XML en programas deaplicación.

Los localizadores de XML pueden utilizarse para hacer referencia a valores XML. Un valor XML puedecaptarse en un localizador de XML. Un localizador XML puede pasarse a un procedimiento o función. Ellocalizador puede especificarse como valor en una sentencia INSERT o UPDATE.

Las entradas de diario para las columnas XML son iguales que para los LOB. Consulte "Diseño deentradas de diario de columnas LOB" en la colección de temas de programación SQL.

Desarrollo de aplicaciones

Varios lenguajes de programación y funciones y procedimientos externos y SQL suministran soporte parael desarrollo de aplicaciones:

Programación SQL XML 3

Page 12: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Soporte de lenguaje de programaciónEl soporte de desarrollo de aplicaciones de XML permite a las aplicaciones combinar XML yalmacenamiento y acceso a datos relacionales. Los siguientes lenguajes de programación dansoporte al tipo de datos XML para SQL:v ILE RPGv ILE COBOLv C o C++ (SQL incorporado o CLI de DB2)v Java™ (JDBC o SQLJ)

Funciones y procedimientos externos y SQLLos datos XML pueden pasarse a procedimientos SQL y procedimientos externos mediante lainclusión de parámetros de tipo de datos XML en las signaturas de parámetro de CREATEPROCEDURE. También pueden pasarse datos XML a funciones externas y SQL mediante lainclusión de parámetros del tipo de datos XML en las signaturas de parámetro de CREATEFUNCTION. Las características de la rutina SQL existentes dan soporte a la implementación deun flujo de lógica de procedimientos alrededor de sentencias SQL, que genera o utiliza valoresXML así como almacenamiento temporal de valores de datos XML en variables.

Administración

Las características de XML suministran un repositorio para la gestión de las dependencias de URI de losdocumentos XML:

Repositorio de esquemas XML (XSR)El repositorio de esquemas XML (XSR) es un repositorio para todos los artefactos XML necesariospara procesar documentos de instancia XML almacenados en columnas XML. Almacenaesquemas XML referenciados en documentos XML. Puede utilizarse para validar o descomponerdocumentos de instancia XML.

Herramientas

IBM i Navigator incluye soporte para el tipo de datos XML.

Descomposición de esquemas XML anotados

Las características de XML permiten almacenar y acceder a los datos XML como documentos XML. Puedehaber casos en los que sea necesario acceder a datos XML como datos relacionales. La descomposición deesquemas XML anotados descompone documentos en función de las anotaciones especificadas en unesquema XML.

Visión general de la entrada y salida XMLEl servidor de bases de datos DB2, que gestiona los datos relacionales y XML, ofrece diversos métodospara la entrada y salida de documentos XML.

Los documentos XML se almacenan en columnas definidas con el tipo de datos XML. Cada fila de unacolumna XML almacena un solo documento XML bien formado. El documento almacenado se mantieneen su formato de documento XML.

Las columnas XML pueden definirse en tablas que contengan columnas de otros tipos, que contengandatos relacionales y pueden definirse varias columnas XML para una sola tabla.

Entrada

El método que utilice para colocar datos XML en el sistema de bases de datos depende de la tarea quedesee realizar:

4 IBM i: Programación SQL XML

Page 13: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Insertar o actualizarLos documentos bien formados se insertan en columnas XML mediante la sentencia SQL INSERT.Un documento está bien formado cuando puede analizarse satisfactoriamente. La validación delos documentos XML durante una operación de inserción o actualización es opcional. Si seefectúa la validación, el esquema XML primero debe registrarse en el repositorio de esquemasXML (XSR). Los documentos se actualizan utilizando la sentencia SQL UPDATE.

Descomposición de esquemas XML anotadosLos datos de los documentos XML pueden descomponerse o almacenarse en columnasrelacionales y XML utilizando la descomposición de esquemas XML anotados. La descomposiciónalmacena los datos en columnas de acuerdo con las anotaciones que se añaden a los documentosde esquema XML. Estas anotaciones correlacionan los datos de documentos XML con columnasde tablas.

Los documentos de esquema XML referenciados por la función de descomposición se almacenanen el repositorio de esquemas XML (XSR).

Registro en el repositorio de esquemas XML (XSR)El repositorio de esquemas XML (XSR) almacena esquemas XML que se utilizan para lavalidación o la descomposición de documentos XML. El registro de esquemas XML suele ser unrequisito previo para otras tareas realizadas en documentos XML que tienen una dependencia deestos esquemas. Los esquemas XML se registran en el XSR utilizando procedimientosalmacenados proporcionados por DB2.

Salida

Se utiliza SQL para recuperar los datos XML del sistema de base de datos.

Al consultar datos XML utilizando una fullselect de SQL, la consulta se realiza en el nivel de columna.Por esta razón, la consulta sólo puede devolver documentos XML completos. Puede utilizarse la funciónde tabla incorporada XMLTABLE para recuperar fragmentos de un documento XML en una consultaSQL.

También están disponibles diversas funciones de publicación para construir valores XML a partir de datosrelacionales almacenados en un servidor de bases de datos DB2. Los valores XML construidos con estasfunciones de publicación no tienen que ser documentos XML bien formados.

Comparación entre XML y los modelos relacionalesAl diseñar las bases de datos, debe decidir si los datos son más adecuados para el modelo XML o elmodelo relacional. Su diseño también puede aprovechar la naturaleza de una base de datos DB2: lacapacidad de dar soporte a datos tanto relacionales como XML en una única base de datos.

Aunque esta descripción explica algunas de las principales diferencias entre los modelos y los factoresque se aplican a cada uno, existen diversos factores que pueden determinar la opción más adecuada parasu implementación. Utilice esta descripción como guía para evaluar los factores que pueden afectar a suimplementación específica.

Principales diferencias entre datos XML y datos relacionales

Los datos XML son jerárquicos; los datos relacionales se representan en un modelo de relacioneslógicas

Un documento XML contiene información sobre la relación de los elementos de datos entre sí enforma de jerarquía. En el modelo relacional, los únicos tipos de relaciones que pueden definirseson relaciones de tabla padre y tabla dependiente.

Los datos XML son autodescriptivos; los datos relacionales, noUn documento XML contiene no sólo los datos, sino también la codificación de los datos queexplica lo que son. Un solo documento puede contener distintos tipos de datos. En el modelo

Programación SQL XML 5

Page 14: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

relacional, el contenido de los datos se define en su definición de columna. Todos los datos deuna columna deben tener el mismo tipo de datos.

Los datos XML tienen un orden inherente; los datos relacionales, noEn un documento XML, se presupone que el orden en que se especifican los elementos de datoses el orden de los datos en el documento. Con frecuencia no hay ninguna otra manera deespecificar el orden dentro del documento. En los datos relacionales, el orden de las filas no estágarantizado a menos que se especifique una cláusula ORDER BY para una o más columnas deuna fullselect.

Factores que influyen en la elección del modelo de datos

El tipo de datos que debe almacenar puede ayudarle a determinar cómo almacenarlos. Por ejemplo, si losdatos son naturalmente jerárquicos y autodescriptivos, puede almacenarlos como datos XML. Sinembargo, hay otros factores que pueden influir en su decisión acerca de qué modelo utilizar:

Cuando se necesita la máxima flexibilidadLas tablas relacionales siguen un modelo bastante rígido. Por ejemplo, normalización de una tablaen muchas o la desnormalización de muchas tablas en una puede ser muy difícil. Si el diseño delos datos cambia a menudo, representarlos como datos XML es una mejor opción. Por ejemplo,los esquemas XML pueden evolucionar a lo largo del tiempo.

Cuando se necesita el máximo rendimiento para la recuperación de datosLa serialización e interpretación de datos XML están sujetas a algunos costes. Si el rendimiento esmás importante que la flexibilidad, los datos relacionales podrían ser la mejor opción.

Cuando los datos se procesan posteriormente como datos relacionalesSi el proceso posterior de los datos depende de que los datos estén almacenados en una base dedatos relacional, podría ser adecuado almacenar partes de los datos como relacionales, utilizandola descomposición. Un ejemplo de esta situación es cuando se aplica el proceso analítico en línea(OLAP) a los datos de un almacén de datos. Además, si es necesario otro proceso en eldocumento XML en conjunto, almacenar algunos de los datos como relacionales así comoalmacenar el documento XML completo podría ser un enfoque adecuado en este caso.

Cuando los componentes de datos tienen un significado fuera de una jerarquíaLos datos pueden ser inherentemente jerárquicos en su naturaleza, pero los componentes hijo nonecesitan los padres para proporcionar valor. Por ejemplo, una orden de compra puede contenernúmeros de pieza. Las órdenes de compra con los números de pieza pueden representarse mejorcomo documentos XML. Sin embargo, cada número de pieza tiene asociada una descripción depieza. Es posible que sea mejor incluir las descripciones de pieza en una tabla relacional, porquela relación entre los números de pieza y las descripciones de pieza es lógicamente independientede las órdenes de compra en las que se utilizan los números de pieza.

Cuando los atributos de datos se aplican a todos los datos, o sólo a un pequeño subconjunto de losdatos Algunos conjuntos de datos tienen un gran número de atributos posibles, pero sólo un pequeño

número de esos atributos se aplica a cualquier valor de datos concreto. Por ejemplo, en uncatálogo de venta, hay muchos atributos de datos posibles, como por ejemplo tamaño, color, peso,material, estilo, tejido, requisitos de alimentación o requisitos de combustible. Para cualquierartículo determinado de catálogo, únicamente es relevante un subconjunto de estos atributos: losrequisitos de alimentación son significativos para una sierra de mesa, pero no para un abrigo.Este tipo de datos es difícil de representar y buscar con un modelo relacional, pero relativamentefácil de representar y buscar con un modelo XML.

Cuando es necesaria la integridad referencialLas columnas XML no pueden definirse como parte de restricciones referenciales. Por tanto, si losvalores de documentos XML deben participar en restricciones referenciales, debe almacenar losdatos como datos relacionales.

Cuando los datos deben actualizarse con frecuenciaLos datos XML de una columna XML sólo se actualizan sustituyendo documentos completos. Si

6 IBM i: Programación SQL XML

Page 15: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

tiene que actualizar frecuentemente pequeños fragmentos de documentos muy grandes para ungran número de filas, puede ser más eficaz de almacenar los datos en columnas que no seanXML. Sin embargo, si está actualizando documentos pequeñas y sólo unos pocos documentos a lavez, almacenarlos como XML también puede ser eficaz.

Guía de aprendizaje de XMLEl tipo de datos XML permite definir columnas de tabla que almacenen en cada fila un único documentoXML bien formado. Esta guía de aprendizaje muestra cómo configurar una base de datos DB2 paraalmacenar datos XML y realizar operaciones básicas con las funciones XML.

Una vez haya completada esta guía de aprendizaje, sabrá realizar las tareas siguientes:v Crear una tabla que puede almacenar datos XMLv Insertar documentos XML en columnas de tipo XMLv Actualizar documentos XML almacenados en una columna XMLv Validar documentos XML contra esquemas XMLv Transformar con hojas de estilo XSLT

Preparación

Los ejemplos de los ejercicios deben especificarse o copiarse y pegarse en la herramienta de ejecución descripts SQL de IBM i Navigator. El SQL interactivo no mostrará los datos de resultado XML como datosserializados.

Ejercicio 1: Crear una tabla que puede almacenar datos XMLEste ejercicio muestra cómo se crea una tabla que contiene una columna XML.

Cree una tabla llamada Customer que contenga una columna XML:CREATE SCHEMA POSAMPLE;

SET CURRENT SCHEMA POSAMPLE;

CREATE TABLE Customer (Cid BIGINT NOT NULL PRIMARY KEY, Info XML);

Tenga en cuenta que la especificación de una clave primaria es opcional y no es necesaria para almacenarXML.

También puede añadir una o más columnas XML a tablas existentes con la sentencia SQL ALTER TABLE.

Volver a la guía de aprendizaje

Ejercicio 2: Insertar documentos XML en columnas de tipo XMLLos documentos XML bien formados se insertan en columnas de tipo XML utilizando la sentencia SQLINSERT. Este ejercicio muestra cómo insertar documentos XML en columnas XML.

Normalmente, los documentos XML se insertan utilizando programas de aplicación. Aunque se puedeninsertar datos XML mediante aplicaciones utilizando tipos XML, binarios o de carácter, es aconsejableutilizar tipos XML o binarios si se procesan documentos XML de muchos orígenes con distintascodificaciones.

Este ejercicio muestra cómo insertar manualmente documentos XML en columnas de tipo XML en laejecución de scripts SQL, donde el documento XML siempre es un literal de caracteres. En la mayoría delos casos, los datos de serie no pueden asignarse directamente a un destino con un tipo de datos XML;los datos deben analizarse primero explícitamente utilizando la función XMLPARSE. Sin embargo, enoperaciones INSERT o UPDATE, los datos de serie pueden asignarse directamente a columnas XML sin

Programación SQL XML 7

Page 16: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

llamar explícitamente a la función XMLPARSE. En estos dos casos, los datos de serie se analizanimplícitamente. Consulte la documentación de análisis de XML para obtener más información.

Inserte tres documentos XML en la tabla Customer que ha creado en el Ejercicio 1:INSERT INTO Customer (Cid, Info) VALUES (1000,’<customerinfo xmlns="http://posample.org" Cid="1000">

<name>Kathy Smith</name><addr country="Canada">

<street>5 Rosewood</street><city>Toronto</city><prov-state>Ontario</prov-state><pcode-zip>M6W 1E6</pcode-zip>

</addr><phone type="work">416-555-1358</phone>

</customerinfo>’);

INSERT INTO Customer (Cid, Info) VALUES (1002,’<customerinfo xmlns="http://posample.org" Cid="1002">

<name>Jim Noodle</name><addr country="Canada">

<street>25 EastCreek</street><city>Markham</city><prov-state>Ontario</prov-state><pcode-zip>N9C 3T6</pcode-zip>

</addr><phone type="work">905-555-7258</phone>

</customerinfo>’);

INSERT INTO Customer (Cid, Info) VALUES (1003,’<customerinfo xmlns="http://posample.org" Cid="1003">

<name>Robert Shoemaker</name><addr country="Canada">

<street>1596 Baseline</street><city>Aurora</city><prov-state>Ontario</prov-state><pcode-zip>N8X 7F8</pcode-zip>

</addr><phone type="work">905-555-2937</phone>

</customerinfo>’);

Puede confirmar que los registros se han insertado satisfactoriamente como se indica a continuación:SELECT * from Customer;

Si está ejecutando este ejercicio en SQL interactivo, los valores XML no se serializarán automáticamente.Debe utilizar explícitamente la función XMLSERIALIZE para ver los datos insertados.

Volver a la guía de aprendizaje

Ejercicio 3: Actualizar documentos XML almacenados en una columna XMLEste ejercicio muestra cómo actualizar documentos XML con sentencias SQL.

Actualización con SQL

Para actualizar un documento XML almacenado en una columna XML mediante SQL, debe realizar unaactualización de documento completo utilizando la sentencia UPDATE de SQL.

Actualice uno de los documentos insertados en el Ejercicio 2 del siguiente modo (donde ha cambiado losvalores de los elementos <street>, <city> y <pcode-zip>):UPDATE customer SET info =’<customerinfo xmlns="http://posample.org" Cid="1002">

<name>Jim Noodle</name><addr country="Canada">

8 IBM i: Programación SQL XML

Page 17: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<street>1150 Maple Drive</street><city>Newtown</city><prov-state>Ontario</prov-state><pcode-zip>Z9Z 2P2</pcode-zip>

</addr><phone type="work">905-555-7258</phone>

</customerinfo>’WHERE Cid = 1002;

Puede confirmar que el documento XML se ha actualizado como se indica a continuación:SELECT * from Customer;

Si está ejecutando este ejercicio en SQL interactivo, los valores XML no se serializarán automáticamente.Debe utilizar explícitamente la función XMLSERIALIZE para ver los datos actualizados.

La fila WHERE Cid="1002" contiene los valores <street>, <city> y <pcode-zip> cambiados.

Los documentos XML pueden identificarse por los valores de las columnas no XML de la misma tabla.

Volver a la guía de aprendizaje

Ejercicio 4: Validar documentos XML con respecto a esquemas XMLEste ejercicio muestra cómo validar documentos XML. Sólo puede validar documentos XML con respectoa esquemas XML; la validación de DTD no está soportada. (Aunque no puede validar con respecto aDTD, puede insertar documentos que contengan un DOCTYPE o que hagan referencia a DTD.)

Existen herramientas disponibles, como las de IBM Rational Application Developer, que ayudan a generaresquemas XML a partir de diversos orígenes, incluyendo DTD, tablas existentes o documentos XML.

Antes de poder validar, debe registrar el esquema XML en el repositorio de esquemas XML incorporado(XSR). Este proceso implica registrar cada documento de esquema XML que forma el esquema XML. Unavez registrados correctamente todos los documentos de esquema XML, debe completar el registro.

Registre y complete el registro del esquema XML posample.customer como se indica a continuación:CREATE PROCEDURE SAMPLE_REGISTERLANGUAGE SQLBEGIN

DECLARE CONTENT BLOB(1M);VALUES BLOB(’<?xml version="1.0"?>

<xs:schema targetNamespace="http://posample.org"xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"><xs:element name="customerinfo">

<xs:complexType><xs:sequence>

<xs:element name="name" type="xs:string" minOccurs="1" /><xs:element name="addr" minOccurs="1" maxOccurs="unbounded">

<xs:complexType><xs:sequence>

<xs:element name="street" type="xs:string" minOccurs="1" /><xs:element name="city" type="xs:string" minOccurs="1" /><xs:element name="prov-state" type="xs:string" minOccurs="1" /><xs:element name="pcode-zip" type="xs:string" minOccurs="1" />

</xs:sequence><xs:attribute name="country" type="xs:string" />

</xs:complexType></xs:element><xs:element name="phone" nillable="true" minOccurs="0" maxOccurs="unbounded">

<xs:complexType><xs:simpleContent>

<xs:extension base="xs:string"><xs:attribute name="type" form="unqualified" type="xs:string" />

Programación SQL XML 9

Page 18: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

</xs:extension></xs:simpleContent>

</xs:complexType></xs:element><xs:element name="assistant" minOccurs="0" maxOccurs="unbounded">

<xs:complexType><xs:sequence>

<xs:element name="name" type="xs:string" minOccurs="0" /><xs:element name="phone" nillable="true" minOccurs="0" maxOccurs="unbounded">

<xs:complexType><xs:simpleContent >

<xs:extension base="xs:string"><xs:attribute name="type" type="xs:string" />

</xs:extension></xs:simpleContent>

</xs:complexType></xs:element>

</xs:sequence></xs:complexType>

</xs:element></xs:sequence><xs:attribute name="Cid" type="xs:integer" />

</xs:complexType></xs:element>

</xs:schema>’) INTO CONTENT;

CALL SYSPROC.XSR_REGISTER(’POSAMPLE’, ’CUSTOMER’, ’http://posample.org’, CONTENT, null);END;

SET PATH POSAMPLE;

CALL SAMPLE_REGISTER;

CALL SYSPROC.XSR_COMPLETE(’POSAMPLE’, ’CUSTOMER’, null, 0);

Puede verificar que el esquema XML se ha registrado satisfactoriamente consultando la vista de catálogoQSYS2.XSROBJECTS, que contiene información sobre los objetos almacenados en el XSR. Esta consulta ysu resultado (formateado para mayor claridad) son los siguientes:SELECT XSROBJECTSCHEMA, XSROBJECTNAME FROM QSYS2.XSROBJECTS

WHERE XSROBJECTSCHEMA = ’POSAMPLE’;

XSROBJECTSCHEMA XSROBJECTNAME-------------------- --------------------POSAMPLE CUSTOMER

Este esquema XML ahora está disponible para ser utilizado para la validación. La validación se realizanormalmente durante una operación INSERT o UPDATE. Realice la validación utilizando la funciónXMLVALIDATE. La operación INSERT o UPDATE en la que se ha especificado XMLVALIDATE sólo serealizará si la validación es satisfactoria.

La sentencia INSERT siguiente inserta un nuevo documento XML en la columna Info de la tablaCustomer, sólo si el documento es válido según el esquema XML posample.customer registradoanteriormente.INSERT INTO Customer(Cid, Info) VALUES (1004, XMLVALIDATE (XMLPARSE (DOCUMENT’<customerinfo xmlns="http://posample.org" Cid="1004">

<name>Robert Shoemaker</name><addr country="Canada">

<street>1596 Baseline</street><city>Aurora</city><prov-state>Ontario</prov-state><pcode-zip>N8X 7F8</pcode-zip>

</addr><phone type="work">905-555-7258</phone><phone type="home">416-555-2937</phone>

10 IBM i: Programación SQL XML

Page 19: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<phone type="cell">905-555-8743</phone><phone type="cottage">613-555-3278</phone>

</customerinfo>’ PRESERVE WHITESPACE )ACCORDING TO XMLSCHEMA ID posample.customer ));

XMLVALIDATE opera sobre datos XML. Debido a que el documento XML de este ejemplo se pasa comodatos de tipo carácter, XMLVALIDATE debe utilizarse junto con la función XMLPARSE. Tenga en cuentaque los datos de tipo carácter pueden asignarse directamente a XML sólo en sentencias INSERT, UPDATEo MERGE. Aquí se utiliza una sentencia INSERT. La función XMLPARSE analiza su argumento como undocumento XML y devuelve un valor XML.

Para verificar que la validación y la inserción han sido satisfactorias, consulte la columna Info:SELECT Info FROM Customer;

Esta consulta debe devolver tres documentos XML, uno de los cuales es el documento que acaba deinsertar.

Volver a la guía de aprendizaje

Ejercicio 5: Transformación con hojas de estilo XSLTPuede utilizar la función XSLTRANSFORM para convertir los datos XML de la base de datos a otrosformatos.

Este ejemplo muestra cómo utilizar la función incorporada XSLTRANSFORM para transformardocumentos XML que están almacenados en la base de datos. En este caso, el documento XML contieneun número arbitrario de registros de estudiantes universitarios. Cada elemento student contiene el ID, elnombre, el apellido, la edad del estudiante y la universidad a la que asiste, como se indica acontinuación:<?xml version="1.0"?><students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<student studentID="1" firstName="Steffen" lastName="Siegmund"age="23" university="Rostock"/>

</students>

La finalidad de esta transformación XSLT es extraer la información de los registros XML y crear unapágina web HTML que pueda visualizarse en un navegador. Con este objetivo, utilizaremos la siguientehoja de estilo XSLT, que también está almacenada en la base de datos.<?xml version="1.0" ?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:param name="headline"/><xsl:param name="showUniversity"/><xsl:template match="students">

<html><head/><body><h1><xsl:value-of select="$headline"/></h1><table border="1"><th><tr><td width="80">StudentID</td><td width="200">First Name</td><td width="200">Last Name</td><td width="50">Age</td><xsl:choose>

<xsl:when test="$showUniversity =’’true’’"><td width="200">University</td>

</xsl:when></xsl:choose></tr></th>

Programación SQL XML 11

Page 20: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<xsl:apply-templates/></table></body></html></xsl:template>

<xsl:template match="student"><tr><td><xsl:value-of select="@studentID"/></td><td><xsl:value-of select="@firstName"/></td><td><xsl:value-of select="@lastName"/></td><td><xsl:value-of select="@age"/></td><xsl:choose>

<xsl:when test="$showUniversity = ’’true’’ "><td><xsl:value-of select="@university"/></td>

</xsl:when></xsl:choose></tr>

</xsl:template></xsl:stylesheet>

Esta hoja de estilo funcionará tanto con una transformación XSLT estándar como utilizando un archivo deparámetros suministrado para controlar su comportamiento en tiempo de ejecución.1. Cree la tabla en la que puede almacenar el documento XML y el documento de hoja de estilo.

SET CURRENT SCHEMA USER;

CREATE TABLE XML_TAB (DOCID INTEGER, XML_DOC XML, XSL_DOC CLOB(1M));

2. Inserte los documentos en las tablas. En este ejemplo, el documento XML y la hoja de estilo XSLTpuede cargarse en la misma tabla como valores de columna distintos. La sentencia INSERT utiliza unaversión truncada de la hoja de estilo XSLT como tercer valor. Para utilizar la siguiente sentenciaINSERT, sustituya el valor de hoja de estilo truncada por la hoja de estilo XSLT indicadaanteriormente en este ejercicio.INSERT INTO XML_TAB VALUES

(1,’<?xml version="1.0"?><students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<student studentID="1" firstName="Steffen" lastName="Siegmund"age="23" university="Rostock"/>

</students>’,

’<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0"

...</xsl:stylesheet>’

);

3. Llame a la función incorporada XSLTRANSFORM para transformar el documento XML.SELECT XSLTRANSFORM (XML_DOC USING XSL_DOC AS CLOB(1M)) FROM XML_TAB;

La salida de este proceso será el archivo HTML siguiente:<html><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><h1></h1><table border="1"><th><tr><td width="80">StudentID</td><td width="200">First Name</td><td width="200">Last Name</td><td width="50">Age</td></tr></th>

12 IBM i: Programación SQL XML

Page 21: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<tr><td>1</td><td>Steffen</td><td>Siegmund</td><td>23</td></tr></table></body></html>

Aunque este procedimiento es sencillo, puede haber ocasiones en que desee alterar el comportamiento dela hoja de estilo XSLT en tiempo de ejecución, ya sea para añadir información no contenida en losregistros XML o para cambiar la naturaleza de la propia salida (a XHTML en lugar de HTML estándar,por ejemplo). Puede pasar parámetros al proceso de XSLT en tiempo de ejecución mediante un archivo deparámetros separado. El archivo de parámetros es en sí mismo un documento XML y contiene sentenciasparam que corresponden a sentencias similares del archivo de hoja de estilo XSLT.

Por ejemplo, dos parámetros están definidos en la hoja de estilo anterior del siguiente modo:<xsl:param name="showUniversity"/><xsl:param name="headline"/>

Estos parámetros no se han utilizado en la primera transformación descrita anteriormente. Para ver cómofunciona el pase de parámetros, cree un archivo de parámetros del siguiente modo:CREATE TABLE PARAM_TAB (DOCID INTEGER, PARAM VARCHAR(1000));

INSERT INTO PARAM_TAB VALUES(1,’<?xml version="1.0"?><params xmlns="http://www.ibm.com/XSLTransformParameters">

<param name="showUniversity" value="true"/><param name="headline">The student list ...</param>

<n/params>’);

Examine esta consulta:SELECT XSLTRANSFORM (

XML_DOC USING XSL_DOC WITH PARAM AS CLOB(1M)) FROM XML_TAB X, PARAM_TAB PWHERE X.DOCID=P.DOCID;

La consulta anterior genera el código HTML siguiente:<html><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><h1>The student’s list ...</h1><table border="1"><th><tr><td width="80">StudentID</td><td width="200">First Name</td><td width="200">Last Name</td><td width="50">Age</td><td width="200">University</td></tr></th><tr><td>1</td><td>Steffen</td><td>Siegmund</td><td>23</td><td>Rostock</td>

Programación SQL XML 13

Page 22: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

</tr></table></body></html>

Volver a la guía de aprendizaje

Inserción de datos XMLPara poder insertar documentos XML, debe crear una tabla que contenga una columna XML o añadir unacolumna XML a una tabla existente.

Adición de columnas XML a tablas existentesPara añadir columnas XML a tablas existentes, se especifican columnas con el tipo de datos XML en lasentencia ALTER TABLE con la cláusula ADD. Una tabla puede tener una o más columnas XML.

Ejemplo La base de datos de ejemplo contiene una tabla para los datos de cliente que contiene doscolumnas XML. La definición es similar a la siguiente:CREATE TABLE Customer (Cid BIGINT NOT NULL PRIMARY KEY,

Info XML,History XML);

Cree una tabla denominada MyCustomer que sea una copia de Customer y añada una columna XMLpara describir las preferencias de cliente:SET CURRENT SCHEMA USER;

CREATE TABLE MyCustomer LIKE Customer;ALTER TABLE MyCustomer ADD COLUMN Preferences XML;

Inserción en columnas XMLPara insertar datos en una columna XML, utilice la sentencia SQL INSERT. La información de entrada enla columna XML debe ser un documento XML bien formado, tal como se define en la especificación XML1.0. El tipo de datos de la aplicación puede ser XML, de carácter o binario.

Debe insertar datos XML de variables del lenguaje principal, en lugar de literales, de modo que elservidor de base de datos DB2 pueda utilizar el tipo de datos de la variable del lenguaje principal paradeterminar parte de la información de codificación.

Los datos XML de una aplicación están en su formato de serie serializada. Al insertar los datos en unacolumna XML, deben convertirse al formato del documento XML almacenado. Si el tipo de datos deaplicación es un tipo de datos XML, el servidor de bases de datos DB2 realiza esta operación de formaimplícita. Si el tipo de datos de la aplicación no es un tipo XML, puede invocar explícitamente la funciónXMLPARSE al realizar la operación de inserción, para convertir los datos de su formato de serieserializada al formato de documento XML.

Durante la inserción de documentos, también puede que desee validar el documento XML contra unesquema XML registrado. Puede hacerlo con la función XMLVALIDATE.

Los ejemplos siguientes muestran cómo se pueden insertar datos XML en columnas XML. Los ejemplosutilizan la tabla MyCustomer, que es una copia de la tabla Customer de ejemplo. Los datos XML quedeben insertarse se encuentran en el archivo c6.xml y tienen el aspecto siguiente:<customerinfo xmlns="http://posample.org" Cid="1015">

<name>Christine Haas</name><addr country="Canada">

<street>12 Topgrove</street><city>Toronto</city><prov-state>Ontario</prov-state><pcode-zip>N8X-7F8</pcode-zip>

14 IBM i: Programación SQL XML

Page 23: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

</addr><phone type="work">905-555-5238</phone><phone type="home">416-555-2934</phone>

</customerinfo>

Ejemplo: en una aplicación JDBC, leer datos XML del archivo c6.xml como datos binarios e insertarlos enuna columna XML:PreparedStatement insertStmt = null;String sqls = null;int cid = 1015;sqls = "INSERT INTO MyCustomer (Cid, Info) VALUES (?, ?)";insertStmt = conn.prepareStatement(sqls);insertStmt.setInt(1, cid);File file = new File("c6.xml");insertStmt.setBinaryStream(2, new FileInputStream(file), (int)file.length());insertStmt.executeUpdate();

Ejemplo: en una aplicación C incorporada estática, insertar datos de una variable del lenguaje principalXML binaria en una columna XML:EXEC SQL BEGIN DECLARE SECTION;

sqlint64 cid;SQL TYPE IS XML AS BLOB (10K) xml_hostvar;

EXEC SQL END DECLARE SECTION;...cid=1015;/* Leer datos del archivo c6.xml en xml_hostvar */...EXEC SQL INSERT INTO MyCustomer (Cid,Info) VALUES (:cid, :xml_hostvar);

Análisis XMLEl análisis de XML es el proceso de convertir los datos XML de su formato de serie serializado a suformato de documento XML.

Puede dejar que el servidor de bases de datos DB2 realice el análisis implícitamente o realizarexplícitamente el análisis de XML.

El análisis de XML implícito se produce en los casos siguientes:v Cuando se pasan datos al servidor de bases de datos utilizando una variable host de tipo XML, o al

utilizar un marcador de parámetro de tipo XMLEl servidor de bases de datos realiza el análisis cuando enlaza el valor de la variable host o marcadorde parámetro para utilizarlo en el proceso de la sentencia.En este caso, debe utilizar el análisis implícito.

v Cuando se asigna una variable host, un marcador de parámetro, o una expresión SQL con un tipo dedatos de serie (carácter, gráfico o binario) a una columna XML en una sentencia INSERT, UPDATE oMERGE. El análisis implícito se produce cuando se ejecuta la sentencia.

El análisis de XML explícito se realiza cuando se invoca la función XMLPARSE en los datos XML deentrada. Puede utilizar el resultado de XMLPARSE en cualquier contexto que acepte un tipo de datosXML. Por ejemplo, puede asignar el resultado a una columna XML o utilizarlo como parámetro de unprocedimiento almacenado de tipo XML.

La función XMLPARSE toma un tipo de datos de carácter no XML, binarios o gráficos Unicode comoentrada. En las aplicaciones de SQL dinámico incorporado, debe convertir el marcador de parámetro querepresenta el documento de entrada de XMLPARSE al tipo de datos adecuado. Por ejemplo:INSERT INTO MyCustomer (Cid, Info)VALUES (?, XMLPARSE(DOCUMENT CAST(? AS CLOB(1K)) PRESERVE WHITESPACE))

Programación SQL XML 15

Page 24: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

En las aplicaciones de SQL incorporado estático, un argumento de variable host de la función XMLPARSEno puede declararse como un tipo XML (tipo XML AS BLOB, XML AS CLOB o XML AS DBCLOB).

Análisis XML y manejo de espacios en blanco

Durante el análisis de XML implícito o explícito, puede conservar la conservación o eliminación de loscaracteres de espacio en blanco al almacenar los datos en la base de datos.

De acuerdo con el estándar XML, los espacio en blanco son los caracteres de espacio (U+0020), losretornos de carro (U+000D), saltos de línea (U+000A) o tabulaciones (U+0009) que están en el documentopara mejorar la legibilidad. Cuando alguno de estos caracteres aparece como parte de una serie de texto,no se considera un espacio en blanco.

Un espacio en blanco de límite es un carácter de espacio en blanco que aparece entre elementos. Porejemplo, en el documento siguiente, los espacios entre <a> y <b> y entre </b> y </a> son espacios enblanco de límite.<a> <b> and between </b> </a>

Con la invocación explícita de XMLPARSE, se utiliza la opción STRIP WHITESPACE o PRESERVEWHITESPACE para controlar la conservación del espacio en blanco de límite. El valor predeterminado eseliminar el espacio en blanco de límite.

Con el análisis de XML implícito:v Si el tipo de datos de entrada no es un tipo XML o no se convierte a un tipo de datos XML, el servidor

de bases de datos DB2 siempre elimina los espacios en blanco.v Si el tipo de datos de entrada es un tipo de datos XML, puede utilizar el registro especial CURRENT

IMPLICIT XMLPARSE OPTION para controlar la conservación del espacio en blanco de límite. Puedeestablecer este registro especial en STRIP WHITESPACE o PRESERVE WHITESPACE. El valorpredeterminado es eliminar el espacio en blanco de límite.

Si utiliza la validación de XML, el servidor de bases de datos DB2 ignora el registro especial CURRENTIMPLICIT XMLPARSE OPTION y utiliza sólo las reglas de validación para determinar la eliminación oconservación del espacio en blanco en los siguientes casos:xmlvalidate(? ACCORDING TOXMLSCHEMA ID nombre-esquema)xmlvalidate(?)xmlvalidate(:hvxml ACCORDING TO XMLSCHEMA ID nombre_esquema)xmlvalidate(:hvxml)xmlvalidate(cast(? as xml) ACCORDING TO XMLSCHEMA ID nombre_esquema)xmlvalidate(cast(? as xml))

En estos casos, ? representa datos XML y :hvxml es una variable host XML.

El estándar XML especifica un atributo xml:space que controla la eliminación o la conservación delespacio en blanco en los datos XML. Los atributos xml:space alteran temporalmente los valores deespacio en blanco para el análisis de XML implícito o explícito.

Por ejemplo, en el documento siguiente, los espacios situados inmediatamente antes y después de <b>siempre se conservan, independientemente de las opciones de análisis de XML, porque los espacios seencuentran en un elemento que está definido con el atributo xml:space="preserve":<a xml:space="preserve"> <b> <c>c</c>b </b></a>

Sin embargo, en el siguiente documento, los espacios situados inmediatamente antes y después de <b>pueden controlarse mediante las opciones de análisis de XML, porque los espacios se encuentran en unelemento que está definido con el atributo xml:space="default":<a xml:space="default"> <b> <c>c</c>b </b></a>

16 IBM i: Programación SQL XML

Page 25: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Funciones de publicación de SQL/XML para construir valores XMLPuede construir valores XML, que no tienen que ser necesariamente documentos XML bien formados,combinando las funciones de publicación que corresponden a los componentes que desea en el valorXML resultante. Las funciones deben especificarse en el orden en que deben aparecer los resultados.

Los valores construidos utilizando las funciones de publicación de SQL/XML se devuelven como XML.En función de lo que desee hacer con el valor XML, puede que necesite serializar explícitamente el valorpara convertirlo a otro tipo de datos SQL. Consulte la documentación sobre serialización XML paraobtener más detalles.

Las siguientes funciones de publicación de SQL/XML pueden utilizarse para construir valores XML.

Función agregada XMLAGGDevuelve una secuencia XML que contiene un elemento por cada valor que no sea nuevo de unconjunto de valores XML.

Función escalar XMLATTRIBUTESConstruye los atributos XML a partir de los argumentos. Esta función sólo puede utilizarse comoargumento de la función XMLELEMENT.

Función escalar XMLCOMMENTDevuelve un valor XML con el argumento de entrada como contenido.

Función escalar XMLCONCATDevuelve una secuencia que contiene la concatenación de un número variable de argumentos deentrada de XML.

Función escalar XMLDOCUMENTDevuelve un valor XML que es un documento XML bien formado. Cada valor XML almacenadoen una tabla de DB2 debe ser un documento. Esta función forma un documento XML a partir delvalor XML.

Función escalar XMLELEMENTDevuelve un valor XML que es un elemento XML. Cada valor XML almacenado en una tabla deDB2 debe ser un documento. La función XMLELEMENT no crea un documento, sólo unelemento. El valor XML almacenado debe ser un documento formado por la funciónXMLDOCUMENT.

Función escalar XMLFORESTDevuelve un valor XML que es una secuencia de elementos XML.

Función de agregado XMLGROUPDevuelve un solo elemento de nivel superior para representar una tabla o el resultado de unaconsulta. De forma predeterminada, cada fila del conjunto de resultados está correlacionada conun subelemento de fila, y cada expresión de entrada está correlacionada con un subelemento delsubelemento de fila. Opcionalmente, cada fila del resultado puede estar correlacionada con unsubelemento de fila, y cada expresión de entrada puede estar correlacionada con un atributo delsubelemento de fila.

Declaración XMLNAMESPACESConstruye declaraciones de espacio de nombres a partir de los argumentos. Esta declaración sólopuede utilizarse como argumento de las funciones XMLELEMENT y XMLFOREST.

Función escalar XMLPIDevuelve un valor XML con una única instrucción de proceso.

Función escalar XMLROWDevuelve una secuencia de elementos de fila para representar una tabla o el resultado de unaconsulta. De forma predeterminada, cada expresión de entrada se transforma en un subelementode un elemento de fila. Opcionalmente, cada expresión de entrada puede transformarse en unatributo de un elemento de fila.

Programación SQL XML 17

Page 26: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Función escalar XMLTEXTDevuelve un valor XML que contiene el valor del argumento de entrada.

Función escalar XSLTRANSFORMConvierte datos XML a otros formatos, incluidos otros esquemas XML.

Ejemplo: Construir un documento XML con valores de una sola tablaEste ejemplo muestra cómo pueden construirse valores XML adecuados para publicar a partir de una solatabla con funciones de publicación de SQL/XML.

Este ejemplo muestra cómo puede construirse un documento XML a partir de los valores almacenados enuna sola tabla. En la consulta siguiente:v Cada elemento <item> se construye con los valores de la columna NOMBRE de la tabla PRODUCT,

utilizando la función XMLELEMENT.v A continuación, todos los elementos <item> se añaden, utilizando XMLAGG, al elemento <allProducts>

construido.v Se añade un espacio de nombres al elemento <allProducts>, con la función XMLNAMESPACES.SELECT XMLELEMENT (NAME "allProducts",

XMLNAMESPACES (DEFAULT ’http://posample.org’),XMLAGG(XMLELEMENT (NAME "item", p.name)))

FROM Product p

Esta consulta devuelve el siguiente valor XML. Aquí está formateado para mejorar la legibilidad.<allProducts xmlns="http://posample.org">

<item>Snow Shovel, Basic 22 inch</item><item>Snow Shovel, Deluxe 24 inch</item><item>Snow Shovel, Super Deluxe 26 inch</item><item>Ice Scraper, Windshield 4 inch</item>

</allProducts>

Puede construir un documento XML similar que contenga una secuencia de elementos de fila utilizandola función XMLROW en lugar de añadir los elementos con XMLAGG. Los elementos item tambiénreciben un prefijo de espacio de nombres:SELECT XMLELEMENT (NAME "products",

XMLNAMESPACES (’http://posample.org’ AS "po"),XMLROW(NAME AS "po:item"))

FROM Product

La salida resultante es la siguiente:<products xmlns:po="http://posample.org">

<row><po:item>Snow Shovel, Basic 22 inch</po:item>

</row></products><products xmlns:po="http://posample.org">

<row><po:item>Snow Shovel, Deluxe 24 inch</po:item>

</row></products><products xmlns:po="http://posample.org">

<row><po:item>Snow Shovel, Super Deluxe 26 inch</po:item></row>

</products><products xmlns:po="http://posample.org">

<row><po:item>Ice Scraper, Windshield 4 inch</po:item></row>

</products>

18 IBM i: Programación SQL XML

Page 27: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo: Construir un documento XML con valores de varias tablasEste ejemplo muestra cómo se pueden construir valores XML adecuados para la publicación a partir devarias tablas con funciones de publicación de SQL/XML.

Este ejemplo muestra cómo puede construirse un documento XML a partir de los valores almacenados envarias tablas. En la consulta siguiente:v se construyen elementos <prod> a partir de un bosque de elementos, denominados name y

numInStock, utilizando la función XMLFOREST. Este bosque se crea con los valores de la columnaNAME de la tabla PRODUCT y de la columna QUANTITY de la tabla INVENTORY.

v A continuación, todos los elementos <prod> se añaden al elemento <saleProducts> construido.SELECT XMLELEMENT (NAME "saleProducts",

XMLNAMESPACES (DEFAULT ’http://posample.org’),XMLAGG (XMLELEMENT (NAME "prod",

XMLATTRIBUTES (p.Pid AS "id"),XMLFOREST (p.name AS "name",

i.quantity AS "numInStock"))))FROM PRODUCT p, INVENTORY iWHERE p.Pid = i.Pid

La consulta anterior genera el documento XML siguiente:<saleProducts xmlns="http://posample.org">

<prod id="100-100-01"><name>Snow Shovel, Basic 22 inch</name><numInStock>5</numInStock>

</prod><prod id="100-101-01">

<name>Snow Shovel, Deluxe 24 inch</name><numInStock>25</numInStock>

</prod><prod id="100-103-01">

<name>Snow Shovel, Super Deluxe 26 inch</name><numInStock>55</numInStock>

</prod><prod id="100-201-01">

<name>Ice Scraper, Windshield 4 inch</name><numInStock>99</numInStock>

</prod></saleProducts>

Ejemplo: Construir un documento XML con los valores de filas de tabla quecontienen elementos nulosEste ejemplo muestra cómo se pueden construir valores XML adecuados para la publicación a partir defilas de tabla que contienen elementos nulos con funciones de publicación de SQL/XML.

Al construir un valor XML mediante XMLELEMENT o XMLFOREST, es posible que se encuentre unvalor nulo al determinar el contenido del elemento. Las opciones EMPTY ON NULL y NULL ON NULLde XMLELEMENT y XMLFOREST permiten especificar si se genera un elemento vacío o ningúnelemento cuando el contenido de un elemento es nulo. El manejo de nulos predeterminado paraXMLELEMENT es EMPTY ON NULL. El manejo de nulos predeterminado para XMLFOREST es NULLON NULL.

En este ejemplo se presupone que la columna LOCATION de la tabla INVENTORY contiene un valornulo en una fila. Por tanto, la consulta siguiente no devuelve el elemento <loc>, ya que XMLFORESTtrata los nulos como nulo de forma predeterminada:SELECT XMLELEMENT (NAME "newElem",

XMLATTRIBUTES (PID AS "prodID"),XMLFOREST (QUANTITY AS "quantity",

LOCATION AS "loc"))FROM INVENTORY

Programación SQL XML 19

Page 28: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

En el valor resultante, no hay ningún elemento <loc> para la fila que contiene el valor nulo.<newElem prodID="100-100-01">

<quantity>5</quantity></newElem>

La misma consulta, con la opción EMPTY ON NULL especificada, devuelve un elemento <loc> vacío:SELECT XMLELEMENT (NAME "newElem",

XMLATTRIBUTES (PID AS "prodID"),XMLFOREST (QUANTITY AS "quantity",

LOCATION AS "loc" OPTION EMPTY ON NULL))FROM INVENTORY

En el valor resultante, hay un elemento <loc> vacío.<newElem prodID="100-100-01">

<quantity>5</quantity><loc/>

</newElem>

Ejemplo: Transformación con hojas de estilo XSLTEl método estándar para transformar datos XML a otros formatos XML es XSLT (Extensible StylesheetLanguage Transformations). Puede utilizar la función incorporada XSLTRANSFORM para convertirdocumentos XML a HTML, texto sin formato o diferentes esquemas XML.

XSLT utiliza hojas de estilo para convertir XML a otros formatos de datos. Puede convertir una parte deun documento XML o todo el documento y seleccionar o reorganizar los datos utilizando el lenguaje deconsultas XPath y las funciones incorporadas de XSLT. XSLT se utiliza habitualmente para convertir XMLa HTML, pero también puede utilizarse para transformar documentos XML que cumplan con unesquema XML en documentos que cumplan con otro esquema. XSLT también puede utilizarse paraconvertir datos XML a formatos relacionados, como texto delimitado por comas o lenguajes de formateocomo troff. XSLT tiene dos área de aplicabilidad principales:v Formateo (conversión de XML a HTML)v Intercambio de datos (consulta, reorganización y conversión de datos de un esquema XML a otro, o a

un formato de intercambio de datos como SOAP)

Ambos casos pueden requerir la transformación de un documento XML completo o sólo de partesseleccionadas del mismo. XSLT incorpora la especificación XPath, que permite la consulta y recuperaciónde datos arbitrarios del documento XML de origen. Una plantilla de XSLT también puede contener ocrear información adicional, como por ejemplo cabeceras de archivo y bloques de instrucciones, que seañadirá al archivo de salida.

Funcionamiento de XSLT

Las hojas de estilo XSLT están escritas en lenguaje de hojas de estilo ampliable (XSL), un esquema XML.XSL es un lenguaje de plantilla en lugar de un lenguaje algorítmico como C o Perl, una característica quelimita la potencia de XSL, pero lo hace idóneo para su finalidad exclusiva. Las hojas de estilo XSLcontienen uno o varios elementos template, que describen qué acción debe realizarse cuando se encuentraun determinado elemento o consulta XML en el archivo de destino. Un elemento de plantilla (template)XSLT típico comenzará especificando a qué elemento se aplica. Por ejemplo,<xsl:template match="product">

declara que el contenido de esta plantilla se utilizará para sustituir el contenido de cualquier código<product> encontrado en el archivo XML de destino. Un archivo XSLT consta de una lista de plantillas deeste tipo, sin orden establecido.

20 IBM i: Programación SQL XML

Page 29: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

El ejemplo siguiente muestra elementos típicos de una plantilla de XSLT. En este caso, el destino serándocumentos XML que contienen información de inventario, como este registro que describe una espátulaquitahielo:<?xml version="1.0"?><product pid="100-201-01">

<description><name>Espátula quitahielo, Parabrisas 4 pulgadas</name><details>Espátula básica quitahielo de 4 pulgadas de ancho, asa de gomaespuma</details><price>3.99</price>

</description></product>

Este registro incluye información como el número de pieza, una descripción y el precio de una espátulaquitahielo para parabrisas. Parte de esta información se encuentra dentro de elementos, como por ejemplo<name>. Otra, como el número de pieza, está contenida en atributos (en este caso el atributo pid delelemento <product>). Para visualizar esta información como página web, puede aplicar la siguienteplantilla XSLT:<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="html"/>

<xsl:template match="/"><html>

<body><h1><xsl:value-of select="/product/description/name"/></h1><table border="1">

<th><xsl:apply-templates select="product"/>

</th></table>

</body></html>

</xsl:template><xsl:template match="product">

<tr><td width="80">product ID</td><td><xsl:value-of select="@pid"/></td>

</tr><tr>

<td width="200">product name</td><td><xsl:value-of select="/product/description/name"/></td>

</tr><tr>

<td width="200">price</td><td>$<xsl:value-of select="/product/description/price"/></td>

</tr><tr>

<td width="50">details</td><td><xsl:value-of select="/product/description/details"/></td>

</tr></xsl:template>

</xsl:stylesheet>

Cuando un procesador XSLT reciba como entrada tanto la plantilla como los documentos de destinoanteriores, generará como salida el documento HTML siguiente:<html><body><h1>Espátula para el hielo, Parabrisas 4 pulgadas</h1><table border="1"><th><tr><td width="80">product ID</td><td>100-201-01</td></tr><tr>

Programación SQL XML 21

Page 30: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<td width="200">product name</td><td>Espátula para el hielo, Parabrisas 4 pulgadas</td></tr><tr><td width="200">price</td><td>$3.99</td></tr><tr><td width="50">details</td><td>Espátula básica quitahielo de 4 pulgadas de ancho, asa de gomaespuma</td></tr></th></table></body></html>

El procesador XSLT comprueba en el documento XML de entrada las condiciones indicadas (normalmenteuna condición por plantilla). Si se cumple una condición, el contenido de la plantilla se inserta en lasalida, y si no se cumple el procesador ignora la plantilla. La hoja de estilo puede añadir sus propiosdatos a la salida, por ejemplo en la codificación de tablas HTML y series como "product ID".

XPath se puede utilizar tanto para definir las condiciones de la plantilla, como en <xsl:templatematch="product">, como para seleccionar e insertar datos desde cualquier lugar en la secuencia XML,como en <h1><xsl:value-select="/product/description/name"/></h1>.

Utilización de XSLTRANSFORM

Puede utilizar la función XSLTRANSFORM para aplicar hojas de estilo XSLT a datos XML. Si proporcionala función con el nombre de un documento XML y una hoja de estilo XSLT, la función aplicará la hoja deestilo al documento y devolverá el resultado.

Ejemplo: Utilización de XSLT como motor de formatoEl ejemplo siguiente muestra cómo utilizar la función incorporada XSLTRANSFORM como motor deformato.

Para obtener la configuración, inserte en primer lugar los dos documentos de ejemplo que hay acontinuación en la base de datos.INSERT INTO XML_TAB VALUES(1,

’<?xml version="1.0"?><students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation = "/home/steffen/xsd/xslt.xsd"><student studentID="1" firstName="Steffen" lastName="Siegmund"

age="23" university="Rostock"/></students>’,

’<?xml version="1.0" ?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:param name="headline"/><xsl:param name="showUniversity"/><xsl:template match="students">

<html><head/>

<body><h1><xsl:value-of select="$headline"/></h1><table border="1">

<th><tr>

<td width="80">StudentID</td><td width="200">First Name</td><td width="200">Last Name</td><td width="50">Age</td><xsl:choose>

<xsl:when test="$showUniversity =’true’">

22 IBM i: Programación SQL XML

Page 31: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<td width="200">University</td></xsl:when>

</xsl:choose></tr>

</th><xsl:apply-templates/>

</table></body></html>

</xsl:template><xsl:template match="student">

<tr><td><xsl:value-of select="@studentID"/></td><td><xsl:value-of select="@firstName"/></td><td><xsl:value-of select="@lastName"/></td><td><xsl:value-of select="@age"/></td><xsl:choose>

<xsl:when test="$showUniversity = ’true’ "><td><xsl:value-of select="@university"/></td>

</xsl:when></xsl:choose>

</tr></xsl:template>

</xsl:stylesheet>’);

A continuación, llame la función XSLTRANSFORM para convertir los datos XML a HTML y visualícelos.SELECT XSLTRANSFORM (XML_DOC USING XSL_DOC AS CLOB(1M)) FROM XML_TAB;

El resultado es este documento:<html><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><h1></h1><table border="1"><th><tr><td width="80">StudentID</td><td width="200">First Name</td><td width="200">Last Name</td><td width="50">Age</td></tr></th><tr><td>1</td><td>Steffen</td><td>Siegmund</td><td>23</td></tr>

</table></body></html>

En este ejemplo, la salida es HTML y los parámetros sólo influyen el HTML que se produce y los datosconvertidos en el mismos. Como tal, ilustra la utilización de XSLT como motor de formato para la salidade usuario final.

Ejemplo: Utilización de XSLT para el intercambio de datosEste ejemplo muestra cómo utilizar la función incorporada XSLTRANSFORM para convertir documentosXML para el intercambio de datos.

Programación SQL XML 23

Page 32: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Este ejemplo utiliza parámetros con la hoja de estilo para generar diferentes formatos de intercambio dedatos en tiempo de ejecución.

Se utiliza una hoja de estilo que incorpora elementos xsl:param para capturar datos de un archivo deparámetros.INSERT INTO Display_productdetails values(1, ’<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:param name="headline"/><xsl:param name="supermarketname"/><xsl:template match="product">

<html><head/>

<body><h1><xsl:value-of select="$headline"/></h1><table border="1">

<th><tr><td width="80">product ID</td><td width="200">product name</td><td width="200">price</td><td width="50">details</td><xsl:choose>

<xsl:when test="$supermarket =’’true’’ "><td width="200">BIG BAZAAR super market</td></xsl:when>

</xsl:choose></tr></th><xsl:apply-templates/>

</table></body></html>

</xsl:template><xsl:template match="product">

<tr><td><xsl:value-of select="@pid"/></td><td><xsl:value-of select="/product/description/name"/></td><td><xsl:value-of select="/product/description/price"/></td><td><xsl:value-of select="/product/description/details"/></td></tr>

</xsl:template></xsl:stylesheet>’

);

El archivo de parámetros contiene parámetros correspondientes a los de la plantilla XSLT, con contenido:CREATE TABLE PARAM_TAB (DOCID INTEGER, PARAM VARCHAR (10K));

INSERT INTO PARAM_TAB VALUES(1,’<?xml version="1.0"?><params xmlns="http://www.ibm.com/XSLTransformParameters">

<param name="supermarketname" value="true"/><param name="headline">BIG BAZAAR super market</param>

</params>’);

A continuación, puede aplicar el archivo de parámetros en tiempo de ejecución mediante el mandatosiguiente:SELECT XSLTRANSFORM (XML_DOC USING XSL_DOC WITH PARAM AS CLOB (1M))

FROM product_details X, PARM_TAB P WHERE X.DOCID=P.DOCID;

24 IBM i: Programación SQL XML

Page 33: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

El resultado es HTML, pero con contenido determinado por el archivo de parámetros y pruebasrealizadas en el contenido del documento XML:<html><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><h1></h1><table border="1"><th><tr><td width="80">product ID</td><td width="200">product Name</td><td width="200">price</td><td width="50">Details</td></tr></th></table></body></html>

En otras aplicaciones, la salida de XSLTRANSFORM podría no ser HTML, sino otro documento XML oun archivo que utilice un formato de datos diferente, como por ejemplo un archivo EDI.

Para aplicaciones de intercambio de datos, el archivo de parámetros puede contener información decabecera de archivo EDI o SOAP, como por ejemplo direcciones de correo electrónico o puerto, u otrosdatos críticos exclusivos de una transacción en particular. Dado que el XML utilizado en los ejemplosanteriores es un registro de inventario, es fácil imaginar la utilización de XSLT para volver a empaquetareste registro para el intercambio con un sistema de compras del cliente.

Ejemplo: Utilización de XSLT para eliminar espacios de nombresLos documentos XML que reciba pueden contener información de espacio de nombres incorrecta oinnecesaria. Puede utilizar hojas de estilo XSLT para eliminar o manipular la información de espacio denombres de los documentos.

Los ejemplos siguientes muestran cómo utilizar XSLT para eliminar la información de espacio de nombresde un documento XML. Los ejemplos almacenan el documento XML y las hojas de estilo XSLT encolumnas XML y utilizan la función XSLTRANSFORM para convertir el documento XML utilizando unade las hojas de estilo XSLT.

Las siguientes sentencias CREATE crean las tablas XMLDATA y XMLTRANS. XMLDATA contiene undocumento XML de ejemplo, y XMLTRANS contiene hojas de estilo XSLT.CREATE TABLE XMLDATA (ID BIGINT NOT NULL PRIMARY KEY, XMLDOC XML );CREATE TABLE XMLTRANS (XSLID BIGINT NOT NULL PRIMARY KEY, XSLT XML );

Añada el documento XML de muestra a la tabla XMLDATA utilizando la siguiente sentencia INSERT.insert into XMLDATA (ID, XMLDOC) values ( 1, ’<newinfo xmlns="http://mycompany.com"><!-- información de cliente fusionada -->

<customerinfo xmlns="http://oldcompany.com" xmlns:d="http://test" Cid="1004"><name>Matt Foreman</name>

<addr country="Canada"><street>1596 Baseline</street><city>Toronto</city><prov-state>Ontario</prov-state><pcode-zip>M3Z 5H9</pcode-zip>

</addr ><phone type="work" >905-555-4789</phone><h:phone xmlns:h="http://test1" type="home">416-555-3376</h:phone><d:assistant>

<name>Gopher Runner</name>

Programación SQL XML 25

Page 34: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<h:phone xmlns:h="http://test1" type="home">416-555-3426</h:phone></d:assistant></customerinfo>

</newinfo>’);

Ejemplo de hoja de estilo XSLT que elimina todos los espacios de nombres

En el ejemplo siguiente se utiliza una hoja de estilo XSLT para eliminar toda la información de espacio denombres del documento XML almacenado en la tabla XMLDATA. El ejemplo almacena la hoja de estiloen la tabla XMLTRANS y utiliza una sentencia SELECT para aplicar la hoja de estilo al documento XML.

Añada la hoja de estilo a la tabla XMLTRANS utilizando la sentencia INSERT.insert into XMLTRANS (XSLID, XSLT) values ( 1, ’<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<!-- conservar comentarios --><xsl:template match="comment()">

<xsl:copy><xsl:apply-templates/>

</xsl:copy></xsl:template>

<xsl:template match="*"><!-- eliminar prefijo de elemento --><xsl:element name="{local-name()}">

<!-- procesar atributos --><xsl:for-each select="@*">

<!-- eliminar prefijo de atributo --><xsl:attribute name="{local-name()}">

<xsl:value-of select="."/></xsl:attribute>

</xsl:for-each><xsl:apply-templates/>

</xsl:element></xsl:template>

</xsl:stylesheet>’) ;

La siguiente sentencia SELECT convierte el documento XML de muestra utilizando la hoja de estilo XSLT.SELECT XSLTRANSFORM (XMLDOC USING XSLT )

FROM XMLDATA, XMLTRANSwhere ID = 1 and XSLID = 1

El mandato XSLTRANSFORM convierte el documento XML utilizando la primera hoja de estilo XSLT ydevuelve el XML siguiente con toda la información de espacio de nombres eliminada.<?xml version="1.0" encoding="UTF-8"?><newinfo><!-- información de cliente fusionada --><customerinfo Cid="1004"><name>Matt Foreman</name><addr country="Canada"><street>1596 Baseline</street><city>Toronto</city><prov-state>Ontario</prov-state><pcode-zip>M3Z 5H9</pcode-zip></addr><phone type="work">905-555-4789</phone><phone type="home">416-555-3376</phone><assistant><name>Gopher Runner</name>

26 IBM i: Programación SQL XML

Page 35: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<phone type="home">416-555-3426</phone></assistant></customerinfo></newinfo>

Ejemplo de hoja de estilo XSLT que conserva el enlace de espacio de nombres para unelemento

En el ejemplo siguiente se utiliza una hoja de estilo XSLT que conserva el enlace de espacio de nombressólo para los elementos phone. El nombre del elemento se especifica en la variable XSLT mynode. Elejemplo almacena la hoja de estilo en la tabla XMLTRANS y utiliza una sentencia SELECT para aplicar lahoja de estilo al documento XML.

Añada la hoja de estilo a la tabla XMLTRANS utilizando la siguiente sentencia INSERT.insert into XMLTRANS (XSLID, XSLT) values ( 2, ’<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/><xsl:variable name ="mynode">phone</xsl:variable>

<!-- conservar comentarios --><xsl:template match="comment()">

<xsl:copy><xsl:apply-templates/>

</xsl:copy></xsl:template>

<xsl:template xmlns:d="http://test" xmlns:h="http://test1" match="*"><xsl:choose>

<!-- conservar prefijo de espacio de nombre para los nombres de nodo $mynode --><xsl:when test="local-name() = $mynode " ><xsl:element name="{name()}">

<!-- procesar atributos de nodo --><xsl:for-each select="@*"><!-- eliminar prefijo de atributo -->

<xsl:attribute name="{local-name()}"><xsl:value-of select="."/>

</xsl:attribute></xsl:for-each><xsl:apply-templates/></xsl:element></xsl:when>

<!-- eliminar prefijo de espacio de nombre del nodo --><xsl:otherwise><xsl:element name="{local-name()}">

<!-- procesar atributos de nodo --><xsl:for-each select="@*"><!-- eliminar prefijo de atributo -->

<xsl:attribute name="{local-name()}"><xsl:value-of select="."/>

</xsl:attribute></xsl:for-each><xsl:apply-templates/></xsl:element></xsl:otherwise>

</xsl:choose></xsl:template>

</xsl:stylesheet>’);

La siguiente sentencia SELECT convierte el documento XML de muestra utilizando la segunda hoja deestilo XSLT porque se especifica XSLID = 2.

Programación SQL XML 27

Page 36: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

SELECT XSLTRANSFORM (XMLDOC USING XSLT)FROM XMLDATA, XMLTRANSwhere ID = 1 and XSLID = 2 ;

El mandato XSLTRANSFORM convierte el documento XML utilizando la segunda hoja de estilo XSLT ydevuelve el XML siguiente únicamente con los espacios de nombres de los elementos phone.<?xml version="1.0" encoding="UTF-8"?><newinfo><!-- información de cliente fusionada --><customerinfo Cid="1004"><name>Matt Foreman</name><addr country="Canada"><street>1596 Baseline</street><city>Toronto</city><prov-state>Ontario</prov-state><pcode-zip>M3Z 5H9</pcode-zip></addr><phone type="work">905-555-4789</phone><h:phone xmlns:h="http://test1" type="home">416-555-3376</h:phone><assistant><name>Gopher Runner</name><h:phone xmlns:h="http://test1" type="home">416-555-3426</h:phone></assistant></customerinfo>

</newinfo>

Consideraciones importantes para la transformación de documentos XMLAl utilizar la función incorporada XSLTRANSFORM para convertir documentos XML, debe tener encuenta algunas consideraciones y restricciones importantes.

Tenga en cuenta lo siguiente al transformar documentos XML:v Los documentos XML de origen deben tener una única raíz y estar bien formados.v Dado que la transformación XSLT genera caracteres UTF-8 de forma predeterminada, la corriente de

salida puede perder caracteres si se inserta en una columna de carácter que no es Unicode.

Restriccionesv Sólo se da soporte a la recomendación W3C XSLT Versión 1.10.v Todos los parámetros y el tipo de resultado deben ser tipos SQL; no pueden ser nombres de archivo.v La transformación con más de un documento de hoja de estilo (utilizando una declaración xsl:include)

no está soportada.

Manejo de caracteres especiales en funciones de publicación de SQL/XMLLas funciones de publicación de SQL/XML tienen un comportamiento predeterminado para el manejo decaracteres especiales.

Valores SQL para valores XML

Determinados caracteres se consideran caracteres especiales dentro de documentos XML, y debenaparecer en su formato de escape utilizando su representación de entidad. A continuación se indicanestos caracteres especiales:

Tabla 1. Caracteres especiales y sus representaciones de entidad

Carácter especial Representación de entidad

< &lt;

28 IBM i: Programación SQL XML

Page 37: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 1. Caracteres especiales y sus representaciones de entidad (continuación)

Carácter especial Representación de entidad

> &gt;

& &amp;

" &quot;

Al publicar valores SQL como valores XML utilizando las funciones de publicación de SQL/XML, estoscaracteres especiales se especifican con escape y se sustituyen por sus entidades predefinidas.

Identificadores SQL y QNames

Al publicar o construir valores XML a partir de valores SQL, puede ser necesario correlacionar unidentificador de SQL con un nombre calificado XML, o QName. Sin embargo, el conjunto de caracteresque se permiten en identificadores SQL delimitados difiere de los permitidos en un QName. Estadiferencia implica que algunos caracteres utilizados en los identificadores de SQL no serán válidos enQNames. Por lo tanto, estos caracteres se sustituyen por su representación de entidad en el QName.

Por ejemplo, considere el identificador de SQL delimitado "phone@work". Debido a que el carácter @ noes un carácter válido en un QName, el carácter se escapa y el QName se convierte en:phone&#x0040;work.

Tenga en cuenta que este comportamiento de escape predeterminado se aplica sólo a los nombres decolumna. Para los identificadores de SQL que se proporcionan como nombre de elemento enXMLELEMENT o como nombre en la cláusula AS de XMLFOREST y XMLATTRIBUTES, no hay ningúnvalor predeterminado de escape. En estos casos debe especificar QNames válidos. Consulte lasespecificaciones de espacio de nombres XML de W3C para obtener más detalles sobre los nombresválidos.

Serialización de XMLLa serialización de XML es el proceso de convertir datos XML del formato que tienen en una base dedatos DB2 al formato de serie serializada que tienen en la aplicación.

Puede dejar que el gestor de bases de datos DB2 realice implícitamente la serialización o invocar lafunción XMLSERIALIZE para solicitar explícitamente la serialización de XML. El uso más común de laserialización XML es al enviar los datos XML desde el servidor de bases de datos al cliente.

La serialización implícita es el método preferido en la mayoría de los casos porque su codificación es mássencilla, y el envío de datos XML al cliente permite que el cliente de DB2 maneje los datos XMLcorrectamente. La serialización explícita requiere un manejo adicional, descrito más adelante, que elcliente maneja automáticamente durante serialización implícita.

En general, la serialización implícita es preferible porque es más eficaz enviar datos al cliente como datosXML. Sin embargo, en determinadas circunstancias (que se describen más adelante), es preferible ejecutarXMLSERIALIZE de forma explícita.

El mejor tipo de datos al que convertir los datos XML es el tipo de datos BLOB, debido a que larecuperación de datos binarios da como resultado menos problemas de codificación.

Serialización de XML implícita

Con la serialización implícita para aplicaciones DB2 CLI y de SQL incorporado, el servidor de bases dedatos DB2 añade a los datos una declaración XML con la codificación adecuada especificada. En lasaplicaciones .NET, el servidor de bases de datos DB2 también añade una declaración XML. En lasaplicaciones Java, en función de los métodos de objeto SQLXML a los que se llame para recuperar los

Programación SQL XML 29

Page 38: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

datos del objeto SQLXML, los datos con una declaración XML añadida por el servidor de bases de datosDB2 no se devolverán.

Ejemplo: en un programa C, serializar implícitamente el documento customerinfo para el ID de cliente'1000' y recuperar el documento serializado en una variable del lenguaje principal XML binaria. Los datosrecuperados se encuentran en el esquema de codificación UTF-8 y contienen una declaración XML.EXEC SQL BEGIN DECLARE SECTION;SQL TYPE IS XML AS BLOB (1M) xmlCustInfo;

EXEC SQL END DECLARE SECTION;...EXEC SQL SELECT INFO INTO :xmlCustInfo

FROM CustomerWHERE Cid=1000;

Serialización de XML explícita

Después de una invocación de XMLSERIALIZE explícita, los datos tienen un tipo no XML en el servidorde bases de datos, y se envían al cliente como ese tipo de datos.

La función escalar XMLSERIALIZE permite especificar:v El tipo de datos SQL al que se convierten los datos cuando se serializan.

El tipo de datos es de carácter, gráfico o binarios.v Si los datos de salida deben incluir la especificación de codificación explícita (EXCLUDING

XMLDECLARATION o INCLUDING XMLDECLARATION).

La salida de XMLSERIALIZE son datos Unicode, de carácter o gráficos.

Si recupera los datos serializados en un tipo de datos no binarios, los datos se convierten a la codificaciónde la aplicación, pero la especificación de codificación no se modifica. Por tanto, probablemente lacodificación de los datos no se ajustará a la especificación de codificación. Esta situación genera datosXML que no pueden ser analizados por los procesos de aplicación que se basan en el nombre de lacodificación.

En general, la serialización implícita es preferible porque es más eficaz enviar datos al cliente como datosXML. Sin embargo, cuando el cliente no admite datos XML, es preferible realizar una XMLSERIALIZEexplícita:

Si el cliente es de una versión anterior que no admite el tipo de datos XML y se utiliza la serialización deXML implícita, el servidor de bases de datos DB2 convierte los datos a un CLOB o DBCLOB antes deenviarlos al cliente.

Si desea que los datos recuperados sean de algún otro tipo, puede utilizar XMLSERIALIZE.

Ejemplo: la columna XML Info de la tabla de ejemplo Customer contiene un documento que contiene elequivalente jerárquico de los datos siguientes:<customerinfo xml:space="default" xmlns="http://posample.org" Cid=’1000’>

<name>Kathy Smith</name><addr country=’Canada’><street>5 Rosewood</street><city>Toronto</city><prov-state>Ontario</prov-state><pcode-zip>M6W 1E6</pcode-zip></addr><phone type=’work’>416-555-1358</phone>

</customerinfo>

30 IBM i: Programación SQL XML

Page 39: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Invoque XMLSERIALIZE para serializar los datos y convertirlos a un tipo BLOB antes de recuperarlos enuna variable del lenguaje principal.SELECT XMLSERIALIZE(Info as BLOB(1M)) into :hostvar from Customer

WHERE CID=1000

Diferencias en un documento XML tras el almacenamiento y recuperaciónAl almacenar un documento XML en una base de datos DB2 y luego recuperar esa copia de la base dedatos, es posible que el documento recuperado no sea exactamente igual que el documento original. Estecomportamiento está definido por el estándar XML y SQL/XML.

Algunos de los cambios en el documento se producen cuando se almacena el documento. Dichos cambiosson:v Si ejecuta XMLVALIDATE, el servidor de bases de datos:

– Elimina los espacios en blanco descartables del documento de entradav Si no solicita la validación de XML, el servidor de bases de datos:

– Elimina los espacios en blanco de límite, si no solicita que se conserven– Sustituye todos los pares de retorno de carro y salto de línea (U+000D y U+000A) o retornos de

carro (U+000D) del documento por saltos de línea (U+000A)– Realiza la normalización de valores de atributo, según la especificación XML 1.0

Este proceso provoca la sustitución de los caracteres de salto de línea (U+000A) de los atributos porcaracteres de espacio (U+0020).

Se producen cambios adicionales cuando se recuperan los datos de una columna XML. Dichos cambiosson:v Si los datos tienen una declaración XML antes de enviarlos al servidor de bases de datos, la declaración

XML no se conserva.Con la serialización implícita para aplicaciones DB2 CLI y de SQL incorporado, el servidor de bases dedatos DB2 añade a los datos una declaración XML con la codificación adecuada especificada. En lasaplicaciones .NET, el servidor de bases de datos DB2 también añade una declaración XML. En lasaplicaciones Java, en función de los métodos de objeto SQLXML a los que se llame para recuperar losdatos del objeto SQLXML, los datos con una declaración XML añadida por el servidor de bases dedatos DB2 no se devolverán.Si ejecuta la función XMLSERIALIZE, el servidor de bases de datos DB2 añade una declaración XMLcon una especificación de la codificación si se especifica la opción INCLUDING XMLDECLARATION.

v En el contenido de un documento o en los valores de atributo, algunos caracteres se sustituyen por susentidades XML predefinidas. Dichos caracteres y sus entidades predefinidas son los siguientes:

Carácter Valor Unicode Representación de entidad

AMPERSAND U+0026 &amp;

SIGNO MENOR QUE U+003C &lt;

SIGNO MAYOR QUE U+003E &gt;

v Dentro de los valores de atributo, el carácter de COMILLAS (U+0022) se sustituye por su entidad XMLpredefinida &quot;.

v Si el documento de entrada tiene una declaración de DTD, la declaración no se conserva y no segeneran códigos basados en la DTD.

v Si el documento de entrada contiene secciones CDATA, esas secciones no se conservan en la salida.

Tipos de datos para el archivado de documentos XMLAunque puede almacenar datos de serie serializada XML en una columna de cualquier tipo de carácter obinario, las columnas no XML deben utilizarse sólo para el archivado de datos XML. El mejor tipo dedatos de columna para el archivado de datos XML es un tipo de datos binarios, como por ejemplo BLOB.

Programación SQL XML 31

Page 40: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

El uso de una columna de tipo carácter para el archivado introduce conversiones de CCSID, que puedenhacer que un documento sea incoherente con su formato original.

Utilización de XMLTABLE para hacer referencia al contenido XMLcomo una tabla relacionalLa función de tabla incorporada XMLTABLE puede utilizarse para recuperar el contenido de undocumento XML como un conjunto de resultados al que puede hacerse referencia en SQL.

Supongamos que tiene una tabla denominada EMP con una columna XML definida del siguiente modo:CREATE TABLE EMP (DOC XML)

La tabla contiene 2 filas, que tienen este aspecto:<dept bldg="101">

<employee id="901"><name>

<first>John</first><last>Doe</last>

</name><office>344</office><salary currency="USD">55000</salary>

</employee><employee id="902">

<name><first>Peter</first><last>Pan</last>

</name><office>216</office><phone>905-416-5004</phone>

</employee></dept>

<dept bldg="114"><employee id="903">

<name><first>Mary</first><last>Jones</last>

</name><office>415</office><phone>905-403-6112</phone><phone>647-504-4546</phone><salary currency="USD">64000</salary>

</employee></dept>

En la invocación de la función XMLTABLE, especifique una expresión XPath de generación de filas y, enla cláusula columns, una o varias expresiones de generación de columnas. En este ejemplo, la expresiónde generación de filas es la expresión XPath $d/dept/employee. La cláusula passing indica que la variable$d hace referencia a la columna XML doc de la tabla emp.SELECT X.*

FROM emp,XMLTABLE (’$d/dept/employee’ PASSING emp.doc AS "d"

COLUMNSempID INTEGER PATH ’@id’,firstname VARCHAR(20) PATH ’name/first’,lastname VARCHAR(25) PATH ’name/last’) AS X

La expresión de generación de filas se aplica a cada documento XML de la columna XML y produce unoo varios elementos employee (subárboles) por documento. La salida de la función XMLTABLE contieneuna fila para cada elemento employee. Por tanto, la salida producida por la expresión XPath degeneración de filas determina la cardinalidad del conjunto de resultados de la sentencia SELECT.

32 IBM i: Programación SQL XML

Page 41: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

La cláusula COLUMNS se utiliza para transformar datos XML en datos relacionales. Cada una de lasentradas de esta cláusula define una columna con un nombre de columna y un tipo de datos SQL. En elejemplo anterior, las filas devueltas tienen 3 columnas denominadas empID, firstname y lastname cuyostipos de datos son Integer, Varchar(20) y Varchar(25), respectivamente. Los valores de cada columna seextraen de los elementos employee, producidos por la expresión XPath de generación de filas, y seconvierten a los tipos de datos SQL. Por ejemplo, la vía de acceso name/first se aplica a cada elementoemployee para obtener el valor de la columna firstname. La expresión de generación de filas proporcionael contexto para las expresiones de generación de columnas. En otras palabras, normalmente puedeañadir una expresión de generación de columnas a la expresión de generación de filas para hacerse unaidea de lo que una función XMLTABLE determinada devuelve para una columna.

El resultado de la consulta anterior es:EMPID FIRSTNAME LASTNAME----------- -------------------- -------------------------

901 John Doe902 Peter Pan903 Mary Jones

Tenga en cuenta que las expresiones de vía de acceso de la cláusula COLUMNS no deben devolver másde un elemento por fila. Si una expresión de vía de acceso devuelve una secuencia de dos o máselementos, la ejecución de XMLTABLE normalmente fallará, ya que no es posible convertir una secuenciade valores XML a un único valor SQL atómico.

Ejemplo: Utilizar XMLTABLE para manejar elementos que faltanEl código XML puede contener elementos opcionales que no están presentes en todos los documentos

Por ejemplo, el empleado Peter Pan no tiene un elemento de salario (salary), ya no es un campo de datosobligatorio. Esto es fácil de tratar debido a que la función XMLTABLE genera valores NULL para loselementos que faltan. Puede escribir consultas XMLTABLE como si el elemento salary siempre estuvierapresente.SELECT X.*

FROM emp,XMLTABLE (’$d/dept/employee’ PASSING doc AS "d"

COLUMNSempID INTEGER PATH ’@id’,firstname VARCHAR(20) PATH ’name/first’,lastname VARCHAR(25) PATH ’name/last’,salary INTEGER PATH ’salary’) AS X

Esta consulta devuelve el resultado siguiente. Observe que la columna salary de Peter Pan tiene el valorNULL porque el documento XML no contiene ningún valor salarial.EMPID FIRSTNAME LASTNAME SALARY----------- -------------------- ------------------------- ----------

901 John Doe 55000902 Peter Pan -903 Mary Jones 64000

Si desea que aparezca un valor distinto de NULL para un elemento que falta, puede definir un valorpredeterminado que se utilizará cuando falte el elemento esperado. A continuación, definimos la columnade resultados de salario para que devuelva 0 en lugar de NULL.SELECT X.*

FROM emp,XMLTABLE (’$d/dept/employee’ PASSING doc AS "d"

COLUMNSempID INTEGER PATH ’@id’,firstname VARCHAR(20) PATH ’name/first’,lastname VARCHAR(25) PATH ’name/last’,salary INTEGER DEFAULT 0 PATH ’salary’) AS X

Programación SQL XML 33

Page 42: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo: Utilizar XMLTABLE para crear un subconjunto de datos de resultadoA menudo se desea producir un resultado que contenga un subconjunto de las filas posibles basándoseen algún predicado de filtrado.

Hay varias maneras de producir un subconjunto de filas. Una solución es añadir una cláusula WHERE ala consulta que debe filtrarse utilizando una columna de salida. Esto requiere generar todas las filas sólopara descartarlas inmediatamente. Otra solución es utilizar predicados de filtro en la expresión degeneración de filas de la función XMLTABLE.

Supongamos que necesita generar filas sólo para los empleados del edificio 114. Puede añadir unacondición correspondiente a XMLTABLE como la siguiente:SELECT X.*

FROM emp,XMLTABLE (’$d/dept[@bldg="114"]/employee’ PASSING doc AS "d"

COLUMNSempID INTEGER PATH ’@id’,firstname VARCHAR(20) PATH ’name/first’,lastname VARCHAR(25) PATH ’name/last’,salary INTEGER DEFAULT 0 PATH ’salary’) AS X

Esta consulta devuelve una sola fila para Mary Jones, que es el único empleado del edificio 114.

Ejemplo: Utilizar XMLTABLE para manejar varios valoresA veces una expresión de vía de acceso hace referencia a un elemento que tiene varios valores.

Las expresiones de vía de acceso de la cláusula COLUMNS no deben generar más de un elemento porfila. En los documentos de muestra, observe que el empleado Mary Jones tiene dos números de teléfono.Si necesita consultar estos datos y devolver una tabla relacional con el nombre y número de teléfono decada empleado, la consulta que escribirá puede ser la siguiente:SELECT X.*

FROM emp,XMLTABLE (’$d/dept/employee’ PASSING doc AS "d"

COLUMNSfirstname VARCHAR(20) PATH ’name/first’,lastname VARCHAR(25) PATH ’name/last’,phone VARCHAR(12) PATH ’phone’) AS X

Cuando se ejecuta con los documentos de muestra, esta consulta falla porque hay dos valores paraphone. Es necesaria otra solución.

Devolver sólo el primer valor

Una forma de tratar este problema es devolver sólo uno de los diversos números de teléfono. Si necesitainformación resumida de cada empleado, un solo número de teléfono puede ser suficiente. La devoluciónde una única aparición del elemento phone puede obtenerse con un predicado posicional en la expresiónXPath para la columna phone.

En XPath se utilizan corchetes para especificar predicados. Para obtener el primer elemento phone de unempleado, utilice un predicado posicional, escrito como [1] o [fn:position()=1]. La primera anotación,[1], es una versión abreviada de la segunda.SELECT X.*

FROM emp,XMLTABLE (’$d/dept/employee’ PASSING doc AS "d"

COLUMNSfirstname VARCHAR(20) PATH ’name/first’,lastname VARCHAR(25) PATH ’name/last’,phone VARCHAR(12) PATH ’phone[1]’) AS X

Devolver varios valores como XML

34 IBM i: Programación SQL XML

Page 43: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Otra opción para devolver varios números de teléfono para un solo empleado es devolver una secuenciaXML de elementos phone. Para lograrlo, la columna phone generada debe ser de tipo XML, lo cualpermite devolver un valor XML como resultado de la expresión XPath.SELECT X.*

FROM emp,XMLTABLE (’$d/dept/employee’ PASSING doc AS "d"

COLUMNSfirstname VARCHAR(20) PATH ’name/first’,lastname VARCHAR(25) PATH ’name/last’,phone XML PATH ’phone’) AS X

El resultado de esta consulta es:FIRSTNAME LASTNAME PHONE----------- ---------- ------------------John Doe -Peter Pan <phone>905-416-5004</phone>Mary Jones <phone>905-403-6112</phone><phone>647-504-4546</phone>

El valor XML devuelto en la columna phone para Mary Jones no es un documento XML bien formado, yaque no hay ningún elemento raíz único. DB2 puede procesar este valor, pero el usuario no podráinsertarlo en una columna XML ni analizarlo con un analizador XML. La combinación de varios númerosde teléfono en un único valor VARCHAR o XML puede requerir código adicional en la aplicación parautilizar los números individuales.

Devolver varias columnas

Otra solución es devolver a cada número de teléfono como un valor VARCHAR separado generando unnúmero fijo de columnas phone de resultado. Este ejemplo utiliza predicados posicionales para devolvernúmeros de teléfono en dos columnas.SELECT X.*

FROM emp,XMLTABLE (’$d/dept/employee’ PASSING doc AS "d"

COLUMNSfirstname VARCHAR(20) PATH ’name/first’,lastname VARCHAR(25) PATH ’name/last’,phone VARCHAR(12) PATH ’phone[1]’,phone2 VARCHAR(12) PATH ’phone[2]’) AS X

Un inconveniente obvio para este enfoque es que un número variable de elementos se correlaciona conun número fijo de columnas. Un empleado puede tener más números de teléfono de lo esperado. Otrospueden tener menos, lo que da como resultado valores nulos. Si cada empleado tiene exactamente unteléfono fijo y un teléfono móvil, puede ser muy útil generar dos columnas con los nombrescorrespondientes.

Devolver una fila para cada valor

En lugar de devolver los números de teléfono en columnas separadas, también puede utilizar XMLTABLEpara devolverlos en filas separadas. En este caso, debe devolver una fila para cada número de teléfono enlugar de una fila para cada empleado. Esto puede dar como resultado información repetida en lascolumnas de nombre y apellido.SELECT X.*

FROM emp,XMLTABLE (’$d/dept/employee/phone’ PASSING doc AS "d"

COLUMNSfirstname VARCHAR(20) PATH ’../name/first’,lastname VARCHAR(25) PATH ’../name/last’,phone VARCHAR(12) PATH ’.’) AS X

El resultado de esta consulta es:

Programación SQL XML 35

Page 44: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

FIRSTNAME LASTNAME PHONE----------- ---------- ------------------

Peter Pan 905-416-5004Mary Jones 905-403-6112Mary Jones 647-504-4546

En este resultado, no hay ninguna fila para John Doe, ya que no tiene número de teléfono.

Manejo de valores de vía de acceso inexistentes

El ejemplo anterior no devolvía una fila para el empleado John Doe porque la expresión row-xquery serepite en todos los elementos phone y no hay ningún elemento phone para el empleado John Doe. Comoresultado, el elemento employee para John Doe nunca se procesa.

Para resolver este problema, debe utilizar una SQL UNION de dos funciones XMLTABLE.SELECT X.*

FROM emp,XMLTABLE (’$d/dept/employee/phone’ PASSING doc AS "d"

COLUMNSfirstname VARCHAR(20) PATH ’../name/first’,lastname VARCHAR(25) PATH ’../name/last’,phone VARCHAR(12) PATH ’.’) AS X

UNIONSELECT Y.*, CAST(NULL AS VARCHAR(12))

FROM emp,XMLTABLE (’$d/dept/employee[fn:not(phone)]’ PASSING doc AS "d"

COLUMNSfirstname VARCHAR(20) PATH ’name/first’,lastname VARCHAR(25) PATH ’name/last’) AS Y

La expresión de la fila $d/dept/employee[fn:not(phone)] de la segunda XMLTABLE devuelve todos losempleados sin número de teléfono, añadiendo las filas de empleado que se han omitido en la primeraXMLTABLE.

Ejemplo: Utilizar XMLTABLE con espacios de nombresLos espacios de nombres XML son un estándar XML de W3C para proporcionar elementos y atributosdenominados de forma exclusiva en un documento XML. Los documentos XML pueden contenerelementos y atributos de vocabularios distintos pero que tienen el mismo nombre. Al dar un espacio denombres a cada vocabulario, se resuelve la ambigüedad entre nombres de atributo o elemento idénticos.

En los documentos XML, los espacios de nombres XML se declaran con el atributo reservado xmlns, cuyovalor debe contener un identificador universal de recursos (URI). Los URI se utilizan comoidentificadores; suelen ser como un URL, pero no tienen que apuntar a una página web existente. Unadeclaración de espacio de nombres también puede contener un prefijo, utilizado para identificar loselementos y atributos. A continuación se muestra un ejemplo de una declaración de espacio de nombrescon y sin prefijo:xmlns:ibm = "http://www.ibm.com/xmltable/"xmlns = "http://www.ibm.com/xmltable/"

Para mostrar el uso de espacios de nombres con XMLTABLE, añadimos un documento de ejemplo alejemplo anterior, por lo que estaremos trabajando con las tres filas siguientes:<dept bldg="101">

<employee id="901"><name>

<first>John</first><last>Doe</last>

</name><office>344</office><salary currency="USD">55000</salary>

</employee>

36 IBM i: Programación SQL XML

Page 45: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<employee id="902"><name>

<first>Peter</first><last>Pan</last>

</name><office>216</office><phone>905-416-5004</phone>

</employee></dept>

<dept bldg="114"><employee id="903">

<name><first>Mary</first><last>Jones</last>

</name><office>415</office><phone>905-403-6112</phone><phone>647-504-4546</phone><salary currency="USD">64000</salary>

</employee></dept>

<ibm:dept bldg="123" xmlns:ibm="http://www.ibm.com/xmltable"><ibm:employee id="144">

<ibm:name><ibm:first>James</ibm:first><ibm:last>Bond</ibm:last>

</ibm:name><ibm:office>007</ibm:office><ibm:phone>905-007-1007</ibm:phone><ibm:salary currency="USD">77007</ibm:salary>

</ibm:employee></ibm:dept>

Para devolver todos los empleados de la base de datos, puede utilizar el carácter comodín * para elprefijo de espacio de nombres en las expresiones de vía de acceso. Esto hace que se tengan en cuentatodos los elementos, independientemente de los espacios de nombres, ya que este comodín (*) coincidecon cualquier espacio de nombres (incluido ningún espacio de nombres).SELECT X.*

FROM emp,XMLTABLE (’$d/*:dept/*:employee’ PASSING doc AS "d"

COLUMNSempID INTEGER PATH ’@*:id’,firstname VARCHAR(20) PATH ’*:name/*:first’,lastname VARCHAR(25) PATH ’*:name/*:last’) AS X

El resultado de la consulta es:EMPID FIRSTNAME LASTNAME----------- -------------------- -------------------------

901 John Doe902 Peter Pan903 Mary Jones144 James Bond

Para estos datos específicos, el comodín de espacio de nombres para el atributo @id no era estrictamentenecesario. La razón es que el atributo @id del empleado James Bond no tiene ningún espacio de nombres.Los atributos nunca heredan los espacios de nombres de su elemento ni tampoco adoptan el espacio denombres predeterminado. Por tanto, a menos que el nombre de atributo tenga un prefijo, no pertenece aningún espacio de nombres.

El uso de la expresión comodín es la forma más sencilla de devolver todos los empleados,independientemente del espacio de nombres.

Programación SQL XML 37

Page 46: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Declarar un espacio de nombres de elemento predeterminado

Cuando todos los elementos que desea consultar pertenecen al mismo espacio de nombres, declarar unespacio de nombres de elemento predeterminado puede ser el modo más sencillo de escribir lasconsultas. Sólo necesita declarar el espacio de nombres predeterminado al principio de la expresión XPathpara que todos los elementos no calificados a los que haga referencia queden asociados a dicho espaciode nombres.SELECT X.*

FROM emp,XMLTABLE (’declare default element namespace "http://www.ibm.com/xmltable";

$d/dept/employee’ PASSING doc AS "d"COLUMNS

empID INTEGER PATH ’@id’,firstname VARCHAR(20) PATH

’declare default element namespace "http://www.ibm.com/xmltable"; name/first’,lastname VARCHAR(25) PATH

’declare default element namespace "http://www.ibm.com/xmltable"; name/last’) AS X

El resultado es:EMPID FIRSTNAME LASTNAME----------- -------------------- -------------------------

144 James Bond

Las expresiones de generación de columnas no heredan la declaración de espacio de nombres de laexpresión de generación de filas. Cada expresión de generación de columnas es una consulta XPathindependiente y necesita su propia declaración de espacio de nombres. Estas declaraciones de espacios denombres pueden ser distintas entre sí, por ejemplo, si el documento contiene varios espacios de nombres.

A menudo sólo hay un espacio de nombres, en cuyo caso sería conveniente declarar un único espacio denombres para todas las expresiones de la función XMLTABLE. Esto puede lograrse mediante la funciónXMLNAMESPACES(). Esta función permite declarar un espacio de nombres de elemento predeterminadoy/o varios prefijos de espacio de nombres que se utilizarán dentro de la función XMLTABLE. La ventajade utilizar la función XMLNAMESPACES es los espacios de nombres declarados son globales para todaslas expresiones del contexto de XMLTABLE, por lo que todas las expresiones XPath tendrán conocimientode estas declaraciones de espacio de nombres y no será necesario repetirlas.

El espacio de nombres predeterminado declarado por la función XMLNAMESPACES se aplica tanto a laexpresión de generación de filas como a todas las expresiones de generación de columnas. De este modosólo es necesaria una declaración de espacio de nombres para todas las expresiones XPath de una funciónXMLTABLE. El resultado de la consulta siguiente es exactamente el mismo que en el ejemplo anterior.SELECT X.*

FROM emp,XMLTABLE (XMLNAMESPACES(DEFAULT ’http://www.ibm.com/xmltable’),

’$d/dept/employee’ PASSING doc AS "d"COLUMNS

empID INTEGER PATH ’@id’,firstname VARCHAR(20) PATH ’name/first’,lastname VARCHAR(25) PATH ’name/last’) AS X

Declarar un prefijo de espacio de nombre con XMLNAMESPACES

Si desea seleccionar elementos y atributos de varios espacios de nombres específicos, la utilización deprefijos de espacio de nombres puede ser la mejor opción. A menos que utilice la funciónXMLNAMESPACES, los prefijos de espacio de nombres deben declararse para cada expresión. Sinembargo, al igual que en los espacios de nombres de elemento predeterminados, puede utilizar la funciónXMLNAMESPACES para evitar declaraciones de espacio de nombres repetidas.SELECT X.*

FROM emp,XMLTABLE (XMLNAMESPACES(’http://www.ibm.com/xmltable’ AS "ibm"),

38 IBM i: Programación SQL XML

Page 47: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

’$d/ibm:dept/ibm:employee’ PASSING doc AS "d"COLUMNS

empID INTEGER PATH ’@id’,firstname VARCHAR(20) PATH ’ibm:name/ibm:first’,lastname VARCHAR(25) PATH ’ibm:name/ibm:last’) AS X

Ejemplo: Numerar filas de resultados para XMLTABLEEn algunos casos, puede que desee generar una columna que numere las filas generadas por XMLTABLEpara un documento determinado. Esto puede ayudar a la aplicación a recordar el orden de aparición delos valores en cada documento.

Para numerar las filas de resultados, utilice la cláusula FOR ORDINALITY. Tenga en cuenta que lanumeración empieza por 1 para cada documento que se especifica en la función XMLTABLE.SELECT X.*

FROM emp,XMLTABLE (’$d/dept/employee’ PASSING doc AS "d"

COLUMNSseqno FOR ORDINALITY,empID INTEGER PATH ’@id’,firstname VARCHAR(20) PATH ’name/first’,lastname VARCHAR(25) PATH ’name/last’) AS X

El resultado de la consulta es:SEQNO EMPID FIRSTNAME LASTNAME-------- ----------- -------------------- -------------------------

1 901 John Doe2 902 Peter Pan1 903 Mary Jones

Actualización de datos XMLPara actualizar datos de una columna XML, utilice la sentencia SQL UPDATE. Incluya una cláusulaWHERE cuando desee actualizar filas específicas. Toda la columna se sustituirá. La información deentrada en la columna XML debe ser un documento XML bien formado. El tipo de datos de la aplicaciónpuede ser XML, de carácter o binario.

Al actualizar una columna XML, puede que también desee validar el documento XML de entrada contraun esquema XML registrado. Puede hacerlo con la función XMLVALIDATE.

Los ejemplos siguientes muestran cómo se pueden actualizar datos XML en columnas XML. Los ejemplosutilizan la tabla MyCustomer, que es una copia de la tabla Customer de muestra. En los ejemplos sepresupone que MyCustomer ya contiene una fila con un valor de ID de cliente de 1004. Se presupone quelos datos XML que actualizan los datos de columna existentes se encuentran en el archivo c7.xml, cuyocontenido es el siguiente:<customerinfo xmlns="http://posample.org" Cid="1004">

<name>Christine Haas</name><addr country="Canada">

<street>12 Topgrove</street><city>Toronto</city><prov-state>Ontario</prov-state><pcode-zip>N9Y-8G9</pcode-zip>

</addr><phone type="work">905-555-5238</phone><phone type="home">416-555-2934</phone>

</customerinfo>

Ejemplo: en una aplicación JDBC, leer los datos XML del archivo c7.xml como datos binarios y utilizarlospara actualizar los datos de una columna XML:

Programación SQL XML 39

Page 48: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

PreparedStatement updateStmt = null;String sqls = null;int cid = 1004;sqls = "UPDATE MyCustomer SET Info=? WHERE Cid=?";updateStmt = conn.prepareStatement(sqls);updateStmt.setInt(1, cid);File file = new File("c7.xml");updateStmt.setBinaryStream(2, new FileInputStream(file), (int)file.length());updateStmt.executeUpdate();

Ejemplo: en una aplicación C incorporada, actualizar los datos de una columna XML a partir de unavariable host XML binaria:EXEC SQL BEGIN DECLARE SECTION;

sqlint64 cid;SQL TYPE IS XML AS BLOB (10K) xml_hostvar;

EXEC SQL END DECLARE SECTION;...cid=1004;/* Leer datos del archivo c7.xml en xml_hostvar */...EXEC SQL UPDATE MyCustomer SET Info=:xml_hostvar WHERE Cid=:cid;

En estos ejemplos, el valor del atributo Cid del elemento <customerinfo> se almacena también en lacolumna relacional Cid. La cláusula WHERE de las sentencias UPDATE utiliza la columna relacional Cidpara especificar las filas que deben actualizarse.

Supresión de datos XML de tablasPara suprimir filas que contienen documentos XML, utilice la sentencia SQL DELETE. Incluya unacláusula WHERE cuando desee suprimir filas específicas.

Una columna XML debe ser NULL o contener un documento XML bien formado. Para suprimir undocumento XML de una columna XML sin suprimir la fila, utilice la sentencia UPDATE con SET NULLpara establecer la columna en NULL, si la columna está definida con admisión de nulos.

El ejemplo siguiente muestra cómo pueden suprimirse datos XML de columnas XML. El ejemplo utilizala tabla MyCustomer, que es una copia de la tabla Customer de muestra, y se presupone que MyCustomer seha llenado con todos los datos de Customer.

Ejemplo: Suprimir las filas de la tabla MyCustomer para las que el valor de la columna Cid es 1002.DELETE FROM MyCustomer WHERE Cid=1002

Repositorio de esquemas XMLEl repositorio de esquemas XML (XSR) es un conjunto de tablas que contienen información acerca de losesquemas XML.

Los documentos de instancia XML pueden contener una referencia a un identificador universal derecursos (URI) que apunte a un esquema XML asociado. Este URI es necesario para procesar losdocumentos de instancia. El sistema de base de datos DB2 gestiona las de dependencias de talesartefactos XML referenciados externamente con el XSR sin necesidad de cambios en la referencia deubicación del URI.

Sin este mecanismo para almacenar los esquemas XML asociados, un recurso externo puede no seraccesible cuando la base de datos lo necesite. El XSR también elimina la sobrecarga adicional necesariapara localizar documentos externos, junto con el posible impacto sobre el rendimiento.

Un esquema XML consta de un conjunto de documentos de esquema XML. Para añadir un esquema XMLal XSR de DB2, debe registrar los documentos de esquema XML en DB2 llamando a los siguientesprocedimientos almacenados suministrados por DB2:

40 IBM i: Programación SQL XML

Page 49: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

SYSPROC.XSR_REGISTERInicia el registro de un esquema XML. Debe llamar a este procedimiento almacenado al añadir elprimer documento de esquema XML a un esquema XML.CALL SYSPROC.XSR_REGISTER (’user1’, ’POschema’,

’http://myPOschema/PO’,:content_host_var, NULL)

SYSPROC.XSR_ADDSCHEMADOCAñade documentos de esquema XML adicionales a un esquema XML que está en proceso deregistro. Sólo puede llamar a SYSPROC.XSR_ADDSCHEMADOC para un esquema XML existenteque aún no esté completo.CALL SYSPROC.XSR_ADDSCHEMADOC (’user1’, ’POschema’,

’http://myPOschema/address’,:content_host_var, NULL)

SYSPROC.XSR_COMPLETECompleta el registro de un esquema XML.CALL SYSPROC.XSR_COMPLETE (’user1’, ’POschema’, :schemaproperty_host_var, 0)

Durante la finalización del esquema XML, DB2 resuelve las referencias dentro de documentos deesquema XML a otros documentos de esquema XML. La corrección de un documento de esquemaXML no se comprueban al registrar o añadir documentos. Las comprobaciones de documentossólo se realizan cuando se completa el registro del esquema XML.

Para eliminar un esquema XML del repositorio de esquemas XML de DB2, puede:v llamar al procedimiento almacenado SYSPROC.XSR_REMOVE, ov utilizar la sentencia SQL DROP XSROBJECT.

Consideraciones sobre ASP independientes para el repositorio de esquemas XML(XSR)

Dado que una agrupación de almacenamiento auxiliar (ASP) independiente se puede conmutar entrevarios sistemas, existen algunas consideraciones adicionales para administrar esquemas XML en una ASP.

La utilización de un esquema XML debe estar restringida a la ASP independiente donde se ha registrado.No se puede hacer referencia a un esquema XML que esté definido en un grupo de ASP independientesdistintas o en la ASP del sistema cuando el trabajo está conectado a la ASP independiente.

Soporte de lenguajes de programación de aplicacionesPuede escribir aplicaciones para almacenar datos XML en tablas de base de datos DB2, recuperar datosde tablas o invocar procedimientos almacenados o funciones definidas por el usuario con parámetrosXML.

Puede utilizar cualquiera de los lenguajes siguientes para escribir sus aplicaciones:v ILE RPGv ILE COBOLv C y C++ (SQL incorporado o CLI de DB2)v Java (JDBC o SQLJ)

Un programa de aplicación puede recuperar un documento completo almacenado en una columna XML.

Cuando una aplicación proporciona un valor XML a un servidor de bases de datos DB2, el servidor debases de datos convierte los datos desde el formato de serie serializada XML a un valor XML con elCCSID especificado.

Programación SQL XML 41

Page 50: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Cuando una aplicación recupera datos de columnas XML, el servidor de bases de datos DB2 convierte losdatos del valor XML, con el CCSID especificado, al formato de serie serializada XML. Además, es posibleque el servidor de bases de datos deba convertir los datos de salida desde el CCSID XML al CCSID de laserie.

Al recuperar datos XML, debe tener en cuenta el efecto de la conversión del CCSID sobre la pérdida dedatos. La pérdida de datos puede producirse cuando los caracteres del CCSID XML de origen no puedenrepresentarse en el CCSID de la serie de destino.

Al extraer un documento XML, se recupera la forma serializada de un documento en una variable deaplicación.

Inserciones y actualizaciones de columnas XML en aplicaciones CLIAl actualizar o insertar datos en columnas XML de una tabla, los datos de entrada deben estar en elformato de serie serializada.

Para los datos XML, se utiliza SQLBindParameter() para enlazar marcadores de parámetro a losalmacenamientos intermedios de entrada.

El tipo de datos XML SQL puede enlazarse a los siguientes tipos de datos de carácter y gráficos deaplicación C:v SQL_C_CHARv SQL_VARCHARv SQL_C_WCHARv SQL_VARGRAPHIC

Los siguientes tipos de datos LOB de carácter:v SQL_C_CLOBv SQL_C_CLOB_LOCATOR

y los siguientes tipos de datos binarios:v SQL_C_BINARYv SQL_C_BLOBv SQL_C_BLOB_LOCATORv SQL_C_BINARY

Cuando se enlaza un almacenamiento intermedio de datos que contiene datos XML como un tipo dedatos binarios, DB2 CLI procesa los datos XML como datos codificados internamente. Este es el métodopreferido porque evita la posible sobrecarga y pérdida de datos de la conversión de caracteres cuando seutilizan tipos de caracteres.

Nota: Los datos XML deben estar enlazados a un tipo de datos binarios cuando el XML se recibe demuchos orígenes con diferentes esquemas de codificación.

Al enlazar un almacenamiento intermedio de datos que contiene datos XML como SQL_C_CHAR oSQL_C_WCHAR, DB2 CLI procesa los datos XML como datos codificados externamente. DB2 CLIdetermina la codificación de los datos de la forma siguiente:v Si el tipo C es SQL_C_WCHAR, DB2 CLI presupone que los datos están codificados como UTF-16.v Si el tipo C es SQL_C_CHAR, DB2 CLI presupone que los datos están codificados en el CCSID

predeterminado de un solo byte de la aplicación.

42 IBM i: Programación SQL XML

Page 51: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Si desea que el servidor de bases de datos analice implícitamente los datos antes de almacenarlos en unacolumna XML, el tipo de datos del marcador de parámetro en SQLBindParameter() debe especificarsecomo SQL_XML.

El ejemplo siguiente muestra cómo actualizar los datos XML en una columna XML utilizando el tipoSQL_C_BINARY.char xmlBuffer[10240];integer length;// Supongamos que una tabla llamada dept se ha creado con la sentencia siguiente:// CREATE TABLE dept (id CHAR(8), deptdoc XML)// xmlBuffer contiene un documento XML codificado internamente que debe sustituir// al documento XML existentelength = strlen (xmlBuffer);SQLPrepare (hStmt, "UPDATE dept SET deptdoc = ? WHERE id = &apos;001&apos;", SQL_NTS);SQLBindParameter (hStmt, 1, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_XML, 0, 0,

xmlBuffer, 10240, &length);SQLExecute (hStmt);

Recuperación de datos XML en aplicaciones CLIAl seleccionar datos de columnas XML de una tabla, los datos de salida se encuentran en formato deserie serializada.

Para los datos XML, cuando se utiliza SQLBindCol() para enlazar columnas de un conjunto de resultadosde consulta con variables de aplicación, puede especificar los tipos de datos de carácter y gráficos C, lostipos de datos de LOB de carácter y gráficos y los tipos de datos binarios de la aplicación. Al recuperarun conjunto de resultados de una columna XML, debe considerar la posibilidad de enlazar la variable deaplicación a los tipos binarios. Un enlace a tipos de carácter puede provocar la pérdida de datos comoresultado de la conversión del CCSID. La pérdida de datos puede producirse cuando los caracteres delCCSID XML de origen no pueden representarse en el CCSID de la serie de destino. Enlazar la variable alos tipos binarios evita estos problemas.

Los datos XML se devuelven a la aplicación como datos codificados internamente. DB2 CLI determina lacodificación de los datos de la forma siguiente:v Si el tipo C es SQL_C_BINARY, DB2 CLI devuelve los datos en el esquema de codificación de valor

XML.v Si el tipo C es SQL_C_CHAR, DB2 CLI devuelve los datos en el esquema de codificación de caracteres

de la aplicación.v Si el tipo C es SQL_C_WCHAR, DB2 CLI devuelve los datos en el esquema de codificación UTF-16.

El servidor de bases de datos realiza una serialización implícita de los datos antes de devolverlos a laaplicación. Puede serializar explícitamente los datos XML a un tipo de datos específico llamando a lafunción XMLSERIALIZE. Sin embargo, es aconsejable realizar la serialización implícita, ya que laserialización explícita a los tipos de carácter con XMLSERIALIZE puede generar problemas decodificación.

El ejemplo siguiente muestra cómo recuperar datos XML de una columna XML en una variable deaplicación binaria.char xmlBuffer[10240];// xmlBuffer se utiliza para contener el documento XML recuperadointeger length;

// Supongamos que una tabla llamada dept se ha creado con la sentencia siguiente:// CREATE TABLE dept (id CHAR(8), deptdoc XML)

length = sizeof (xmlBuffer);SQLExecute (hStmt, "SELECT deptdoc FROM dept WHERE id=&apos;001&apos;", SQL_NTS);SQLBindCol (hStmt, 1, SQL_C_BINARY, xmlBuffer, &length, NULL);

Programación SQL XML 43

Page 52: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

SQLFetch (hStmt);SQLCloseCursor (hStmt);// xmlBuffer contiene ahora un documento XML válido codificado en UTF-8

Declaración de variables del lenguaje principal XML en aplicaciones de SQLincorporadoPara intercambiar datos XML entre el servidor de bases de datos y una aplicación de SQL incorporado,tiene que declarar las variables del lenguaje principal en el código fuente de la aplicación.

Los datos XML se almacenan en una columna de tipo de datos XML de una tabla. Las columnas con eltipo de datos XML se describen como un SQLTYPE de columna SQL_TYP_XML, y las aplicacionespueden enlazar varios tipos de datos específicos del lenguaje para la entrada y la salida de estascolumnas o parámetros. Puede accederse directamente a las columnas XML utilizando SQL o lasextensiones SQL/XML. El tipo de datos XML no se aplica únicamente a las columnas. Las funcionespueden tener argumentos de valores XML y generar también valores XML. De forma similar, losprocedimientos almacenados pueden tomar valores XML como parámetros de entrada y de salida.

Los datos XML son de tipo carácter por naturaleza y tienen una codificación que especifica el juego decaracteres utilizado. La codificación de los datos XML puede determinarse externamente, derivada deltipo de aplicación base que contiene la representación de serie serializada del documento XML. Tambiénpuede determinarse internamente, lo cual requiere la interpretación de los datos. Para los documentoscodificados en Unicode, es aconsejable utilizar una marca de orden de bytes (BOM), consistente en uncódigo de carácter Unicode al principio de una corriente de datos. El BOM se utiliza como una signaturaque define el orden de los bytes y el formato de codificación Unicode.

Pueden utilizarse los tipos de carácter, gráficos y binarios existentes, que incluyen CHAR, VARCHAR,CLOB, DBCLOB y BLOB, además de variables de lenguaje principal XML para captar e insertar datos. Sinembargo, no estarán sujetos al análisis de XML implícito, como lo estarían las variables del lenguajeprincipal XML. En lugar de ello, se aplica una función XMLPARSE explícita con eliminación de espaciosen blanco predeterminada.

Para declarar variables del lenguaje principal XML en aplicaciones de SQL incorporado, en la sección dedeclaración de la aplicación, declare los tipos de datos AS LOB de las variables del lenguaje principalXML. Los ejemplos mostrados aquí corresponden a C, pero la sintaxis es similar para los demás lenguajessoportados.v SQL TYPE IS XML AS CLOB(n) <nombre_varhost> para definir una variable de lenguaje principal CLOB

que contiene datos XML codificados en el CCSID especificado por la opción de archivo QAQQINISQL_XML_DATA_CCSID.

v SQL TYPE IS XML AS DBCLOB(n) <nombre_varhost> para definir una variable del lenguaje principalDBCLOB que contiene datos XML. Está codificada en el CCSID especificado por la opción de archivoQAQQINI SQL_XML_DATA_CCSID si la opción es UCS-2 o UTF-16, de lo contrario, el CCSIDpredeterminado es UTF-16.

v SQL TYPE IS XML AS BLOB(n) <nombre_varhost> para definir una variable del lenguaje principal BLOBque contiene datos XML codificados internamente.

v SQL TYPE IS XML AS LOCATOR <nombre_varhost> para definir un localizador que contiene datos XML.v SQL TYPE IS XML AS CLOB_FILE <nombre_varhost> para definir un archivo CLOB que contiene datos

XML codificados en el CCSID del archivo.v SQL TYPE IS XML AS DBCLOB_FILE <nombre_varhost> para definir un archivo DBCLOB que contiene

datos XML codificados en el CCSID predeterminado de doble byte de la aplicación.v SQL TYPE IS XML AS BLOB_FILE <nombre_varhost> para definir un archivo BLOB que contiene datos

XML codificados internamente.

44 IBM i: Programación SQL XML

Page 53: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo: Cómo hacer referencia a variables host XML en aplicaciones de SQL incorporado:

Las siguientes aplicaciones de ejemplo muestran cómo hacer referencia a variables host XML en C y enCOBOL.

Aplicación C de SQL incorporado:EXEC SQL BEGIN DECLARE;

SQL TYPE IS XML AS CLOB( 10K ) xmlBuf;SQL TYPE IS XML AS BLOB( 10K ) xmlblob;SQL TYPE IS CLOB( 10K ) clobBuf;

EXEC SQL END DECLARE SECTION;// utilizando una variable host XML AS CLOB// El valor XML escrito en xmlBuf irá prefijado con una declaración XML// similar a: <?xml version = "1.0" encoding = "UTF-8"?>// Nota: el nombre de codificación dependerá del valor de QAQQINI SQL_XML_DATA_CCSIDEXEC SQL SELECT xmlCol INTO :xmlBuf

FROM myTableWHERE id = ’001’;

EXEC SQL UPDATE myTableSET xmlCol = :xmlBufWHERE id = ’001’;

// utilizando una variable host XML AS BLOB// El valor XML escrito en xmlblob irá prefijado con una declaración XML// similar a: <?xml version = "1.0" encoding = "UTF-8"?>EXEC SQL SELECT xmlCol INTO :xmlblob

FROM myTableWHERE id = ’001’;

EXEC SQL UPDATE myTableSET xmlCol = :xmlblobWHERE id = ’001’;

// utilizando una variable host CLOB// La salida se codificará en el CCSID predeterminado de un solo byte de la aplicación,// pero no contendrá una declaración XMLEXEC SQL SELECT XMLSERIALIZE (xmlCol AS CLOB(10K)) INTO :clobBuf

FROM myTableWHERE id = ’001’;

EXEC SQL UPDATE myTableSET xmlCol = XMLPARSE (:clobBuf PRESERVE WHITESPACE)WHERE id = ’001’;

Aplicación COBOL de SQL incorporado:EXEC SQL BEGIN DECLARE SECTION END-EXEC.

01 xmlBuf USAGE IS SQL TYPE IS XML as CLOB(5K).01 clobBuf USAGE IS SQL TYPE IS CLOB(5K).01 xmlblob USAGE IS SQL TYPE IS XML AS BLOB(5K).

EXEC SQL END DECLARE SECTION END-EXEC.

* utilizando una variable host XML AS CLOBEXEC SQL SELECT xmlCol INTO :xmlBuf

FROM myTableWHERE id = ’001’.

EXEC SQL UPDATE myTableSET xmlCol = :xmlBufWHERE id = ’001’.

* utilizando una variable host XML AS BLOBEXEC SQL SELECT xmlCol INTO :xmlblob

FROM myTableWHERE id = ’001’.

EXEC SQL UPDATE myTableSET xmlCol = :xmlblobWHERE id = ’001’.

Programación SQL XML 45

Page 54: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

* utilizando una variable host CLOBEXEC SQL SELECT XMLSERIALIZE(xmlCol AS CLOB(10K)) INTO :clobBuf

FROM myTableWHERE id= ’001’.

EXEC SQL UPDATE myTableSET xmlCol = XMLPARSE(:clobBuf) PRESERVE WHITESPACEWHERE id = ’001’.

Recomendaciones para el desarrollo de aplicaciones de SQL incorporado con XML:

La utilización de XML en aplicaciones de SQL incorporado está sujeta a las siguientes recomendaciones yrestricciones.v Las aplicaciones deben acceder a todos los datos XML en formato de serie serializada.

– Debe representar todos los datos, incluidos los datos numéricos y de fecha y hora, en su formato deserie serializado.

v Los datos XML externalizados están limitados a 2 GB.v Todos los cursores que contienen datos XML son sin bloqueo (cada operación de captación genera una

solicitud de servidor de bases de datos).v Cuando las variables host de tipo carácter contienen datos XML serializados, se presupone la

utilización del CCSID de la variable host como codificación de los datos, y debe coincidir con cualquiercodificación interna que exista en los datos.

v Debe especificar un tipo de datos LOB como el tipo base para una variable del lenguaje principal XML.v Al utilizar SQL estático, si se espera un tipo de datos XML en la entrada, el uso de variables host

CHAR, VARCHAR, CLOB, DBCLOB y BLOB estará sujeto a una operación XMLPARSE concaracterísticas de manejo de espacio en blanco predeterminadas ('STRIP WHITESPACE'). Cualquier otrotipo de variable host que no sea XML se rechazará.

Identificación de valores XML en un SQLDA:

Para indicar que un tipo base alberga datos XML, debe actualizarse el campo sqlname de SQLVAR.v sqlname.length debe ser 8v Los dos primeros bytes de sqlname.data deben ser X'0000'v El tercer y cuarto bytes de sqlname.data deben ser X'0000'v El quinto byte de sqlname.data debe ser X'01' (al que se hace referencia como el indicador de subtipo

XML sólo cuando se cumplen las dos primeras condiciones)v Los restantes bytes deben ser X'000000'

Si el indicador de subtipo XML está establecido en un SQLVAR cuyo SQLTYPE no es LOB, se devolveráun error SQL0804 en tiempo de ejecución.

Nota: SQL_TYP_XML sólo se puede devolver desde la sentencia DESCRIBE. Este tipo no puede utilizarsepara otras solicitudes. La aplicación debe modificar SQLDA para que contenga un tipo binario o decarácter válido y establecer el campo sqlname adecuadamente para indicar que los datos son XML.

JavaJava y XML

Datos XML en aplicaciones JDBC:

En las aplicaciones JDBC, puede almacenar en columnas XML y recuperar datos de columnas XML.

En las tablas de base de datos, el tipo de datos integrado XML se utiliza para almacenar datos XML enuna columna.

46 IBM i: Programación SQL XML

Page 55: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

En las aplicaciones, los datos XML se encuentran en formato de serie serializada.

En las aplicaciones JDBC, puede:v Almacenar un documento XML completo en una columna XML mediante los métodos setXXX.v Recuperar un documento XML completo de una columna XML mediante los métodos getXXX.

Se pueden utilizar objetos java.sql.SQLXML de JDBC 4.0 para recuperar y actualizar datos de columnasXML. Las invocaciones de métodos de metadatos, tales como ResultSetMetaData.getColumnTypeName,devuelven el valor entero java.sql.Types.SQLXML para una columna de tipo XML.

Actualizaciones de columnas XML en aplicaciones JDBC:

Cuando actualiza o inserta datos en columnas XML de una tabla de base de datos, los datos de entradade sus aplicaciones JDBC deben tener el formato de serie de caracteres serializada.

La tabla siguiente lista los métodos y los correspondientes tipos de datos de entrada que puede utilizarpara insertar datos en columnas XML.

Tabla 2. Métodos y tipos de datos para actualizar columnas XML

Método Tipo de datos de entrada

PreparedStatement.setAsciiStream InputStream

PreparedStatement.setBinaryStream InputStream

PreparedStatement.setBlob Blob

PreparedStatement.setBytes byte[]

PreparedStatement.setCharacterStream Reader

PreparedStatement.setClob Clob

PreparedStatement.setObject byte[], Blob, Clob, SQLXML, InputStream, Reader, String

PreparedStatement.setString String

La codificación de los datos XML se puede derivar de los datos mismos, conocidos como datos codificadosinternamente; si se derivan de fuentes externas se conocen como datos codificados externamente. Los datosXML que se envían al servidor de bases de datos como datos binarios se consideran datos codificadosinternamente. Los datos XML que se envían a la fuente de datos como datos de tipo carácter se tratancomo datos codificados externamente.

La codificación externa utilizada para aplicaciones Java es siempre la codificación Unicode.

Los datos codificados externamente pueden tener una codificación interna. Es decir, los datos se puedenenviar a la fuente de datos como datos de tipo carácter, pero los datos contienen información decodificación. El origen de datos maneja las incompatibilidades entre la codificación interna y externagenerando un error si las codificaciones externa e interna son incompatibles.

Los datos de las columnas XML se almacenan en el CCSID de la columna XML. El origen de datosmaneja la conversión de los datos desde su codificación interna o externa al CCSID de la columna XML.

El ejemplo siguiente muestra la inserción de datos de un objeto SQLXML en una columna XML. Losdatos son de tipo carácter (String), por lo que la fuente de base de datos trata los datos como codificadosexternamente.public void insertSQLXML(){

Connection con = DriverManager.getConnection(url);SQLXML info = con.createSQLXML;

// Crear objeto SQLXML

Programación SQL XML 47

Page 56: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

PreparedStatement insertStmt = null;String infoData =

"<customerinfo xmlns=""http://posample.org"" " +"Cid=""1000"" xmlns=""http://posample.org"">...</customerinfo>";

cid.setString(cidData);// Llenar objeto SQLXML con datos

int cid = 1000;try {

sqls = "INSERT INTO CUSTOMER (CID, INFO) VALUES (?, ?)";insertStmt = con.prepareStatement(sqls);insertStmt.setInt(1, cid);insertStmt.setSQLXML(2, info);

// Asignar el valor del objeto SQLXML// a un parámetro de entrada

if (insertStmt.executeUpdate() != 1) {System.out.println("insertSQLXML: Ningún registro insertado.");

}}catch (IOException ioe) {ioe.printStackTrace();

}catch (SQLException sqle) {

System.out.println("insertSQLXML: SQL Exception: " +sqle.getMessage());

System.out.println("insertSQLXML: SQL State: " +sqle.getSQLState());

System.out.println("insertSQLXML: SQL Error Code: " +sqle.getErrorCode());

}}

El ejemplo siguiente muestra la inserción de datos de un archivo en una columna XML. Los datos seinsertan como datos binarios, de manera que el servidor de bases de datos respeta la codificación interna.public void insertBinStream(){

PreparedStatement insertStmt = null;String sqls = null;int cid = 0;ResultSet rs=null;Statement stmt=null;try {

sqls = "INSERT INTO CUSTOMER (CID, INFO) VALUES (?, ?)";insertStmt = conn.prepareStatement(sqls);insertStmt.setInt(1, cid);File file = new File(fn);insertStmt.setBinaryStream(2,

new FileInputStream(file), (int)file.length());if (insertStmt.executeUpdate() != 1) {

System.out.println("insertBinStream: Ningún registro insertado.");}

}catch (IOException ioe) {ioe.printStackTrace();}catch (SQLException sqle) {System.out.println("insertBinStream: SQL Exception: " +

sqle.getMessage());System.out.println("insertBinStream: SQL State: " +

sqle.getSQLState());System.out.println("insertBinStream: SQL Error Code: " +

sqle.getErrorCode());}

}

48 IBM i: Programación SQL XML

Page 57: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Recuperación de datos XML en aplicaciones JDBC:

En las aplicaciones JDBC, se utilizan los métodos ResultSet.getXXX o ResultSet.getObject para recuperardatos de columnas XML.

Al recuperar datos de columnas XML de una tabla de DB2, los datos de salida se encuentran en formatode serie serializada.

Puede utilizar una de las técnicas siguientes para recuperar datos XML:v Utilice el método ResultSet.getSQLXML para recuperar los datos. Luego utilice un método

SQLXML.getXXX para transformar los datos a un tipo de datos de salida compatible. El métodoSQLXML.getBinaryStream añade una declaración XML con una especificación de codificación a losdatos de salida. Los métodos SQLXML.getString y SQLXML.getCharacterStream no añaden ladeclaración XML.

v Utilice un método ResultSet.getXXX que no sea ResultSet.getObject para recuperar los datos en un tipoque sea compatible.

La tabla siguiente muestra los métodos ResultSet y sus correspondientes tipos de datos de salida pararecuperar datos XML.

Tabla 3. Métodos ResultSet y tipos de datos para recuperar datos XML

Método Tipo de datos de salida

ResultSet.getAsciiStream InputStream

ResultSet.getBinaryStream InputStream

ResultSet.getBytes byte[]

ResultSet.getCharacterStream Reader

ResultSet.getSQLXML SQLXML

ResultSet.getString String

La tabla siguiente muestra los métodos que puede invocar para recuperar datos de un objetojava.sql.SQLXML, los tipos de datos de salida correspondientes y el tipo de codificación utilizado en lasdeclaraciones XML.

Tabla 4. Métodos SQLXML y DB2Xml, tipos de datos y especificaciones de codificación añadidas

Método Tipo de datos de salida

Tipo de declaración decodificación interna XMLañadida

SQLXML.getBinaryStream InputStream Codificación de CCSID decolumna XML

SQLXML.getCharacterStream Reader Ninguna

SQLXML.getSource Origen Ninguna

SQLXML.getString String Ninguna

Si la aplicación ejecuta la función XMLSERIALIZE en los datos que se deben devolver, después de laejecución de la función, los datos tendrán el tipo especificado en la función XMLSERIALIZE, no el tipo dedatos XML. Por consiguiente, el controlador maneja los datos como el tipo especificado y pasa por altocualquier declaración de codificación interna.

El ejemplo siguiente muestra la recuperación de datos de una columna XML en un objeto SQLXML y, acontinuación, la utilización del método SQLXML.getString para recuperar los datos en una serie.

Programación SQL XML 49

Page 58: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

public void fetchToSQLXML(){

System.out.println(">> fetchToSQLXML: Get XML data as an SQLXML object " +"using getSQLXML");PreparedStatement selectStmt = null;String sqls = null, stringDoc = null;ResultSet rs = null;

try{sqls = "SELECT info FROM customer WHERE cid = " + cid;selectStmt = conn.prepareStatement(sqls);rs = selectStmt.executeQuery();

// Obtener metadatos// El tipo de la columna XML es el entero java.sql.Types.OTHERResultSetMetaData meta = rs.getMetaData();String colType = meta.getColumnType(1);System.out.println("fetchToSQLXML: Column type = " + colType);while (rs.next()) {// Recuperar los datos XML con getSQLXML.// A continuación escribirlo en una serie de texto con// codificación ISO-10646-UCS-2 interna explícita.java.sql.SQLXML xml = rs.getSQLXML(1);System.out.println (xml.getString());

}rs.close();}catch (SQLException sqle) {

System.out.println("fetchToSQLXML: SQL Exception: " +sqle.getMessage());

System.out.println("fetchToSQLXML: SQL State: " +sqle.getSQLState());

System.out.println("fetchToSQLXML: SQL Error Code: " +sqle.getErrorCode());

}}

El ejemplo siguiente muestra la recuperación de datos de una columna XML en una variable String.public void fetchToString()

{System.out.println(">> fetchToString: Get XML data " +"using getString");PreparedStatement selectStmt = null;String sqls = null, stringDoc = null;ResultSet rs = null;

try{sqls = "SELECT info FROM customer WHERE cid = " + cid;selectStmt = conn.prepareStatement(sqls);rs = selectStmt.executeQuery();

// Obtener metadatos// El tipo de la columna XML es el entero java.sql.Types.OTHERResultSetMetaData meta = rs.getMetaData();String colType = meta.getColumnType(1);System.out.println("fetchToString: Column type = " + colType);

while (rs.next()) {stringDoc = rs.getString(1);System.out.println("Document contents:");System.out.println(stringDoc);

}catch (SQLException sqle) {

System.out.println("fetchToString: SQL Exception: " +sqle.getMessage());

System.out.println("fetchToString: SQL State: " +

50 IBM i: Programación SQL XML

Page 59: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

sqle.getSQLState());System.out.println("fetchToString: SQL Error Code: " +

sqle.getErrorCode());}

}

Invocación de rutinas con parámetros XML en aplicaciones Java:

Los procedimientos almacenados de SQL o externos y las funciones definidas por el usuario externaspueden incluir parámetros XML.

Para los procedimientos de SQL, los parámetros de la definición de procedimiento almacenado tienen eltipo XML. En los procedimientos almacenados externos y funciones definidas por el usuario, losparámetros XML de la definición de rutina tienen el tipo XML AS. Cuando invoca un procedimientoalmacenado o una función definida por el usuario que tiene parámetros XML, necesita utilizar un tipo dedatos compatible en la sentencia de invocación.

Para invocar una rutina con parámetros de entrada XML desde un programa JDBC, utilice parámetros deltipo java.sql.SQLXML. Para registrar parámetros de salida XML, registre los parámetros como el tipojava.sql.Types.SQLXML.

Ejemplo: programa JDBC que llama a un procedimiento almacenado que utiliza tres parámetros XML: unparámetro IN, un parámetro OUT y un parámetro INOUT. Este ejemplo requiere JDBC 4.0.java.sql.SQLXML in_xml = xmlvar;java.sql.SQLXML out_xml = null;java.sql.SQLXML inout_xml = xmlvar;

// Declarar un parámetro XML de entrada,// de salida y de entrada/salida

Connection con;CallableStatement cstmt;ResultSet rs;...stmt = con.prepareCall("CALL SP_xml(?,?,?)");

// Crear un objeto CallableStatementcstmt.setObject (1, in_xml); // Establecer parámetro de entradacstmt.setObject (3, inout_xml); // Establecer parámetro E/Scstmt.registerOutParameter (2, java.sql.Types.SQLXML);// Registrar parámetros de entrada y de salidacstmt.registerOutParameter (3, java.sql.Types.SQLXML);cstmt.executeUpdate(); // Llamar al procedimiento almacenadoout_xml = cstmt.getSQLXML(2); // Obtener el valor del parámetro OUTinout_xml = cstmt.getSQLXML(3); // Obtener el valor del parámetro INOUTSystem.out.println("Valores de parámetros de llamada a SP_xml: ");System.out.println("Valor de parámetro de salida ");MyUtilities.printString(out_xml.getString());

// Utilizar el método SQLXML.getString// para convertir el valor out_xml// a una serie para impresión.// Llamar a un método definido por el usuario denominado// printString (no se muestra) para imprimir// el valor.

System.out.println("Valor del parámetro INOUT "); MyUtilities.printString(inout_xml.getString());// Utilizar el método SQLXML.getString// para convertir el valor inout_xml// a una serie para impresión.// Llamar a un método definido por el usuario denominado// printString (no se muestra) para imprimir// el valor.

Ejemplo: programa SQLJ que llama un procedimiento almacenado que utiliza tres parámetros XML: unparámetro IN, un parámetro OUT y un parámetro INOUT. Este ejemplo requiere JDBC 4.0.

Programación SQL XML 51

Page 60: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

java.sql.SQLXML in_xml = xmlvar;java.sql.SQLXML out_xml = null;java.sql.SQLXML inout_xml = xmlvar;

// Declarar un parámetro XML de entrada,// de salida y de entrada/salida

...#sql [myConnCtx] {CALL SP_xml(:IN in_xml,

:OUT out_xml,:INOUT inout_xml)};

// Invocar el procedimiento almacenadoSystem.out.println("Valores de parámetros de llamada a SP_xml: ");System.out.println("Valor de parámetro de salida ");MyUtilities.printString(out_xml.getString());

// Utilizar el método SQLXML.getString// para convertir el valor out_xml// a una serie para impresión.// Llamar a un método definido por el usuario denominado// printString (no se muestra) para imprimir// el valor.

System.out.println("Valor del parámetro INOUT "); MyUtilities.printString(inout_xml.getString());// Utilizar el método SQLXML.getString// para convertir el valor inout_xml// a una serie para impresión.// Llamar a un método definido por el usuario denominado// printString (no se muestra) para imprimir// el valor.

Datos XML en aplicaciones SQLJ:

En las aplicaciones SQLJ, puede almacenar en columnas XML y recuperar datos de columnas XML.

En las tablas de DB2, el tipo de dato incorporado XML se utiliza para almacenar datos XML en unacolumna.

En las aplicaciones, los datos XML se encuentran en formato de serie serializada.

En las aplicaciones SQLJ, puede:v Almacenar un documento XML completo en una columna XML mediante sentencias INSERT o

UPDATE.v Recuperar un documento XML completo de una columna XML mediante iteradores o sentencias

SELECT de una sola fila.

Se pueden utilizar objetos java.sql.SQLXML de JDBC 4.0 para recuperar y actualizar datos de columnasXML. Las invocaciones de métodos de metadatos, tales como ResultSetMetaData.getColumnTypeName,devuelven el valor entero java.sql.Types.SQLXML para una columna de tipo XML.

Actualizaciones de columna XML en aplicaciones SQLJ:

Cuando actualiza o inserta datos en columnas XML de una tabla en una aplicación SQLJ, los datos deentrada deben tener el formato de serie de caracteres serializada.

Los tipos de datos de expresión de lenguaje principal que se pueden utilizar para actualizar las columnasXML son:v java.sql.SQLXML (requiere SQLJ Versión 4.0 o posterior)v Stringv bytev Blobv Clob

52 IBM i: Programación SQL XML

Page 61: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v sqlj.runtime.AsciiStreamv sqlj.runtime.BinaryStreamv sqlj.runtime.CharacterStream

Para los tipos de corrientes, debe utilizarse la expresión de lenguaje principal sqlj.runtime.tipoStream, enlugar de una expresión de lenguaje principal java.io.typeInputStream, a fin de pasar la longitud de lacorriente al controlador JDBC.

La codificación de los datos XML se puede derivar de los datos mismos, conocidos como datos codificadosinternamente; si se derivan de fuentes externas se conocen como datos codificados externamente. Los datosXML que se envían al servidor de bases de datos como datos binarios se consideran datos codificadosinternamente. Los datos XML que se envían a la fuente de datos como datos de tipo carácter se tratancomo datos codificados externamente. Para JVM, se utiliza la codificación externa por omisión.

La codificación externa utilizada para aplicaciones Java es siempre la codificación Unicode.

Los datos codificados externamente pueden tener una codificación interna. Es decir, los datos se puedenenviar a la fuente de datos como datos de tipo carácter, pero los datos contienen información decodificación. El origen de datos maneja las incompatibilidades entre la codificación interna y externagenerando un error si las codificaciones externa e interna son incompatibles.

Los datos de las columnas XML se almacenan en el CCSID de la columna XML.

Supongamos que utiliza la sentencia siguiente para insertar datos de la expresión de lenguaje principal deserie xmlString en una columna XML de una tabla. xmlString es un tipo de carácter, por lo que se utilizasu codificación externa.#sql [ctx] {INSERT INTO CUSTACC VALUES (1, :xmlString)};

Expresión de lenguaje principal sqlj.runtime.CharacterStream: supongamos que construye unaexpresión de lenguaje principal sqlj.runtime.CharacterStream e inserta datos de la expresión de lenguajeprincipal sqlj.runtime.CharacterStream en una columna XML de una tabla.java.io.StringReader xmlReader =

new java.io.StringReader(xmlString);sqlj.runtime.CharacterStream sqljXmlCharacterStream =

new sqlj.runtime.CharacterStream(xmlReader, xmlString.length());#sql [ctx] {INSERT INTO CUSTACC VALUES (4, :sqljXmlCharacterStream)};

sqljXmlCharacterStream es un tipo de carácter, por lo que se utiliza su codificación externa.

Supongamos que recupera un documento de una columna XML en una expresión de lenguaje principaljava.sql.SQLXML e inserta los datos en una columna XML de una tabla.java.sql.ResultSet rs = s.executeQuery ("SELECT * FROM CUSTACC");rs.next();java.sql.SQLXML xmlObject = (java.sql.SQLXML)rs.getObject(2);#sql [ctx] {INSERT INTO CUSTACC VALUES (6, :xmlObject)};

Una vez que haya recuperado los datos, seguirán estando codificados en UTF-8. En consecuencia, cuandoinserte los datos en otra columna XML, no se llevará a cabo ninguna conversión.

Recuperación de datos XML en aplicaciones de SQLJ:

Cuando recupera datos procedentes de columnas XML de una tabla de base de datos en una aplicaciónSQLJ, los datos de salida se deben serializar explícita o implícitamente.

Los tipos de datos de iterador o expresión de lenguaje principal que puede utilizar para recuperar datosde las columnas XML son:

Programación SQL XML 53

Page 62: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v java.sql.SQLXML (SQLJ Versión 4.0)v Stringv byte[]v sqlj.runtime.AsciiStreamv sqlj.runtime.BinaryStreamv sqlj.runtime.CharacterStream

Si la aplicación no llama a la función XMLSERIALIZE antes de la recuperación de datos, los datos seconvierten de UTF-8 a la codificación de aplicación externa para los tipos de datos de caracteres o lacodificación interna para los tipos de datos binarios. No se ha añadido una declaración XML. Si laexpresión de lenguaje principal es un objeto de tipo java.sql.SQLXML o com.ibm.db2.jcc.DB2Xml, esnecesario invocar un método adicional para recuperar los datos de este objeto. El método que invoquedetermina la codificación de los datos de salida y si se añade una declaración XML con una especificaciónde la codificación.

La tabla siguiente muestra los métodos que puede invocar para recuperar datos de un objetojava.sql.SQLXML o com.ibm.db2.jcc.DB2Xml, los tipos de datos de salida correspondientes y el tipo decodificación utilizado en las declaraciones XML.

Tabla 5. Métodos SQLXML y DB2Xml, tipos de datos y especificaciones de codificación añadidas

Método Tipo de datos de salida

Tipo de declaración decodificación interna XMLañadida

SQLXML.getBinaryStream InputStream Codificación de CCSID decolumna XML

SQLXML.getCharacterStream Reader Ninguna

SQLXML.getSource Origen Ninguna

SQLXML.getString String Ninguna

Si la aplicación ejecuta la función XMLSERIALIZE en los datos que se deben devolver, después de laejecución de la función, los datos tendrán el tipo especificado en la función XMLSERIALIZE, no el tipo dedatos XML. Por consiguiente, el controlador maneja los datos como el tipo especificado y pasa por altocualquier declaración de codificación interna.

Supongamos que recupera datos de una columna XML en una expresión de lenguaje principal de tipoString.#sql iterator XmlStringIter (int, String);#sql [ctx] siter = {SELECT C1, CADOC from CUSTACC};#sql {FETCH :siter INTO :row, :outString};

El tipo String es un tipo de carácter, por lo que los datos se convierten de UTF-8 a la codificación externay se devuelven sin ninguna declaración XML.

Supongamos que recupera datos de una columna XML en una expresión de lenguaje principal byte[].#sql iterator XmlByteArrayIter (int, byte[]);XmlByteArrayIter biter = null;#sql [ctx] biter = {SELECT c1, CADOC from CUSTACC};#sql {FETCH :biter INTO :row, :outBytes};

El tipo byte[] es un tipo binario, por lo que no se produce ninguna conversión de datos desde lacodificación UTF-8, y los datos se devuelven sin ninguna declaración XML.

54 IBM i: Programación SQL XML

Page 63: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Supongamos que recupera un documento de una columna XML en una expresión de lenguaje principaljava.sql.SQLXML, pero necesita los datos en una corriente binaria.#sql iterator SqlXmlIter (int, java.sql.SQLXML);SqlXmlIter SQLXMLiter = null;java.sql.SQLXML outSqlXml = null;#sql [ctx] SqlXmlIter = {SELECT c1, CADOC from CUSTACC};#sql {FETCH :SqlXmlIter INTO :row, :outSqlXml};java.io.InputStream XmlStream = outSqlXml.getBinaryStream();

La sentencia FETCH recupera los datos y los coloca en el objeto SQLXML según la codificación UTF-8.SQLXML.getBinaryStream almacena los datos en una corriente binaria.

RutinasRutinas y XML

Soporte de XML en procedimientos SQL:

Los procedimientos SQL admiten parámetros y variables de tipo de datos XML. También puede utilizarseen sentencias SQL, del mismo modo que las variables de cualquier otro tipo de datos.

En el siguiente ejemplo se muestra la declaración, el uso y la asignación de los parámetros y variablesXML en un procedimiento SQL:CREATE TABLE T1(C1 XML) ;

CREATE PROCEDURE proc1(IN parm1 XML, IN parm2 VARCHAR(32000))LANGUAGE SQLBEGIN

DECLARE var1 XML;

/* insertar el valor de parm1 en la tabla T1 */INSERT INTO T1 VALUES(parm1);

/* analizar valor del parámetro parm2 y asignarlo a una variable */SET var1 = XMLPARSE(document parm2 preserve whitespace);

/* insertar la variable var1 en tabla T1INSERT INTO T1 VALUES(var1);

END ;

En el ejemplo anterior hay una tabla T1 con una columna XML. El procedimiento SQL acepta dosparámetros, parm1 y parm2. parm1 es del tipo de datos XML. Dentro del procedimiento SQL, se declarauna variable XML denominada var1.

El valor del parámetro parm2 se analiza utilizando la función XMLPARSE y se asigna a la variable XMLvar1. A continuación, el valor de la variable XML también se inserta en la columna C1 de la tabla T1.

Efecto de los compromisos y retroacciones en valores de parámetros y variables XML de procedimientos de SQL:

Los compromisos y retrotracciones de los procedimientos de SQL afectan a los valores de los parámetrosy variables de tipo de datos XML. Durante la ejecución de los procedimientos SQL, al producirse unaoperación de confirmación o retrotracción, los valores asignados a las variables XML y a los parámetrosXML dejarán de estar disponibles.

Los intentos de hacer referencia a una variable SQL o parámetro SQL del tipo de datos XML después deuna operación de compromiso o retrotracción provocarán un error.

Para hacer referencia de modo satisfactorio a parámetros y variables XML después de una operación decompromiso o retrotracción, antes deben asignárseles nuevos valores.

Programación SQL XML 55

Page 64: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tenga en cuenta la disponibilidad de los valores de las variables y parámetros XML al añadir sentenciasROLLBACK y COMMIT a los procedimientos de SQL.

Soporte para el tipo de datos XML en rutinas externas:

Procedimientos y funciones externos escritos en lenguajes de programación que dan soporte a parámetrosy variables de tipo de datos XML:

Estos lenguajes de programación incluyen:v ILE RPGv ILE COBOLv Cv C++v Java

Los valores de tipo de datos XML se representan en el código de la rutina externa de la misma maneraque los tipos de datos de carácter, gráficos y binarios.

Al declarar los parámetros de la rutina externa del tipo de datos XML, las sentencias CREATEPROCEDURE y CREATE FUNCTION que se utilizarán para crear las rutinas en la base de datos debenespecificar que el tipo de datos XML debe almacenarse como un tipo de datos de carácter, gráfico obinario. El tamaño del valor de carácter, gráfico o binario debe ser cercano al tamaño del documentoXML representado por el parámetro XML.

A continuación figura una sentencia CREATE PROCEDURE de un procedimiento externo implementadoen el lenguaje de programación C con un parámetro XML llamado parm1:CREATE PROCEDURE myproc(IN parm1 XML AS CLOB(2M), IN parm2 VARCHAR(32000))LANGUAGE CFENCEDPARAMETER STYLE SQLEXTERNAL NAME ’mylib.myproc’;

Hay que tener en cuenta consideraciones parecidas al crear funciones definidas por usuario (UDF)externas, como se ve en el siguiente ejemplo:CREATE FUNCTION myfunc (IN parm1 XML AS CLOB(2M))RETURNS SMALLINTLANGUAGE CPARAMETER STYLE SQLDETERMINISTICNOT FENCEDNULL CALLNO SQLNO EXTERNAL ACTIONEXTERNAL NAME ’mylib1.myfunc’

En el código de las rutinas externas, los valores de los parámetros y variables XML se acceden, estableceny modifican de la misma manera que en las aplicaciones de bases de datos.

Ejemplo: Soporte de XML en procedimientos Java (JDBC):

Una vez comprendidos los fundamentos de los procedimientos Java y la programación en Java utilizandola interfaz de programación de aplicaciones (API) JDBC, puede empezar a crear y utilizar procedimientosJava que consulten datos XML.

Este ejemplo de procedimiento Java ilustra:v Sentencia CREATE PROCEDURE para un procedimiento del estilo de parámetros JAVA

56 IBM i: Programación SQL XML

Page 65: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v El código fuente para un procedimiento del estilo de parámetros JAVAv Los parámetros de entrada y salida de tipo de datos XML

Archivo de código externo Java

En el ejemplo se muestra una implementación de procedimiento Java. El ejemplo se compone de dospartes: la sentencia CREATE PROCEDURE y la implementación de código Java externo del procedimientodesde el que se puede crear la clase Java asociada.

El archivo fuente Java que contiene las implementaciones de procedimientos de los ejemplos siguientes sedenomina stpclass.java y está incluido en un archivo JAR denominado myJAR. El archivo tiene el formatosiguiente:

Formato del archivo de código externo Javausing System;import java.lang.*;import java.io.*;import java.sql.*;import java.util.*;

public class stpclass{ ...// Implementaciones de procedimientos Java

...}

Es importante tener en cuenta el nombre del archivo de clase y el nombre de JAR que contenga unaimplementación de procedimiento dada. Estos nombres son importantes, porque la cláusula EXTERNALde la sentencia CREATE PROCEDURE de cada procedimiento debe especificar esta información a fin deque DB2 pueda localizar la clase en tiempo de ejecución.

Ejemplo: Procedimiento del estilo de parámetros JAVA con parámetros XML

Este ejemplo muestra lo siguiente:v Sentencia CREATE PROCEDURE para un procedimiento del estilo de parámetros JAVAv Código Java para un procedimiento del estilo de parámetros JAVA con parámetros XML

Este procedimiento toma un parámetro de entrada, inXML, inserta una fila que incluye dicho valor en unatabla, consulta datos XML utilizando una sentencia SQL y una expresión XQuery y establece dosparámetros de salida outXML1 y outXML2.

Código para crear un procedimiento JAVA de estilo de parámetros con parámetros XMLCREATE PROCEDURE xmlProc1 ( IN inNUM INTEGER,

IN inXML XML as CLOB (1K),OUT out1XML XML as CLOB (1K),OUT out2XML XML as CLOB (1K) )

DYNAMIC RESULT SETS 0DETERMINISTICLANGUAGE JAVAPARAMETER STYLE JAVAMODIFIES SQL DATAFENCEDTHREADSAFEDYNAMIC RESULT SETS 0PROGRAM TYPE SUBNO DBINFOEXTERNAL NAME ’stpclass.xmlProc1’;

Programación SQL XML 57

Page 66: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

public void xmlProc1(int inNum,CLOB inXML ,CLOB [] out1XML,)

throws Exception{

Connection con = DriverManager.getConnection("jdbc:default:connection");

// Insertar datos incluyendo el valor de parámetro XML en una tablaString query = "INSERT INTO xmlDataTable (num, inXML ) VALUES ( ?, ? )" ;String xmlString = inXML.getCharacterStream() ;

stmt = con.prepareStatement(query);stmt.setInt(1, inNum);stmt.setString (2, xmlString );stmt.executeUpdate();stmt.close();

// Consultar y recuperar un solo valor XML de una tabla utilizando SQLquery = "SELECT xdata from xmlDataTable WHERE num = ? " ;

stmt = con.prepareStatement(query);stmt.setInt(1, inNum);ResultSet rs = stmt.executeQuery();

if ( rs.next() ){ out1Xml[0] = (CLOB) rs.getObject(1); }

rs.close() ;stmt.close();

return ;}

Ejemplo: Soporte de XML en procedimientos C:

Una vez comprendidos los conceptos básicos de los procedimientos, los fundamentos de las rutinas C yXML, puede empezar a crear y utilizar procedimientos C con características XML.

El ejemplo que hay a continuación muestra un procedimiento de C con parámetros del tipo XML asícomo el modo de actualizar y consultar datos XML.

Código C para un procedimiento de estilo parámetros SQL con características XML

Este ejemplo muestra lo siguiente:v Sentencia CREATE PROCEDURE para un procedimiento del estilo de parámetros SQLv Código C para un procedimiento del estilo de parámetros SQL con parámetros XML

Este procedimiento recibe dos parámetros de entrada. El primer parámetro de entrada se denomina inNumy es del tipo INTEGER. El segundo parámetro de entrada se denomina inXML y es del tipo XML. Losvalores de los parámetros de entrada se utilizan para insertar una fila en la tabla xmlDataTable. Acontinuación, se recupera un valor XML utilizando una sentencia SQL. El valor XML recuperado seasigna al parámetro out1XML. No se devuelven conjuntos de resultados.CREATE PROCEDURE xmlProc1 ( IN inNUM INTEGER,

IN inXML XML as CLOB (1K),OUT out1XML XML as CLOB (1K)

)LANGUAGE CPARAMETER STYLE SQLDYNAMIC RESULT SETS 0

58 IBM i: Programación SQL XML

Page 67: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

DETERMINISTICMODIFIES SQL DATAPROGRAM TYPE SUBEXTERNAL NAME ’xmlProc1’ ;

//*************************************************************************// Procedimiento almacenado: xmlProc1//// Finalidad: insertar datos XML en una columna XML//// Parámetros://// IN: inNum -- la secuencia de datos XML que debe insertarse en la tabla xmldata// inXML -- datos XML que deben insertarse// OUT: out1XML -- datos XML devueltos - valor recuperado mediante SQL//*************************************************************************#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sqlda.h>#include <sqlca.h>#include <sqludf.h>#include <sql.h>#include <memory.h>

#ifdef __cplusplusextern "C"#endifSQL_API_RC SQL_API_FN testSecA1(sqlint32* inNum,

SQLUDF_CLOB* inXML,SQLUDF_CLOB* out1XML,SQLUDF_NULLIND *inNum_ind,SQLUDF_NULLIND *inXML_ind,SQLUDF_NULLIND *out1XML_ind,SQLUDF_TRAIL_ARGS)

{char *str;FILE *file;

EXEC SQL INCLUDE SQLCA;

EXEC SQL BEGIN DECLARE SECTION;sqlint32 hvNum1;SQL TYPE IS XML AS CLOB(200) hvXML1;SQL TYPE IS XML AS CLOB(200) hvXML2;

EXEC SQL END DECLARE SECTION;

/* Comprobar indicadores nulos para parámetros de entrada */if ((*inNum_ind &lt; 0) || (*inXML_ind &lt; 0)) {

strcpy(sqludf_sqlstate, "38100");strcpy(sqludf_msgtext, "Entrada nula recibida");return 0;

}

/* Copiar parámetros de entrada en variables host */hvNum1 = *inNum;hvXML1.length = inXML->length;strncpy(hvXML1.data, inXML->data, inXML->length);

/* Ejecutar sentencia SQL */EXEC SQL

INSERT INTO xmlDataTable (num, xdata) VALUES (:hvNum1, :hvXML1);

/* Ejecutar sentencia SQL */EXEC SQL

SELECT xdata INTO :hvXML2FROM xmlDataTableWHERE num = :hvNum1;

Programación SQL XML 59

Page 68: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

exit:

/* Establecer código de retorno de salida */*outReturnCode = sqlca.sqlcode;*outReturnCode_ind = 0;

return 0;}

Codificación de datos XMLLa codificación de datos XML se puede derivar de los datos mismos, conocidos como datos codificadosinternamente; si se derivan de fuentes externas se conocen como datos codificados externamente.

El tipo de datos de la aplicación que se utiliza para intercambiar los datos XML entre la aplicación y lacolumna XML determina cómo se deriva la codificación.v Los datos XML que se encuentran en tipos de datos de aplicación de carácter o gráficos se consideran

codificados externamente. Como datos de carácter y gráficos, los datos XML que se encuentran en estostipos de datos se consideran codificados en el CCSID declarado de la variable del lenguaje principal.

v Los datos XML que se encuentran en un tipo de datos de aplicación binario o datos binarios que seencuentran en un tipo de datos de carácter se consideran codificados internamente.

Los datos XML codificados externamente pueden contener codificación interna, como por ejemplo cuandoun documento XML de un tipo de datos de carácter contiene una declaración de codificación. El gestorde bases de datos comprueba la codificación interna de los datos codificados externamente enviados auna base de datos DB2.

El CCSID efectivo que está asociado con la codificación interna debe coincidir con la codificación externa;de lo contrario, se produce un error.

Consideraciones sobre codificación al almacenar o pasar datos XMLLos datos XML deben estar codificados correctamente para poder almacenarlos en una tabla DB2. Debetenerse en cuenta la codificación cuando los datos se recuperan de la tabla y se utilizan conprocedimientos almacenados o funciones DB2 definidas por el usuario, o cuando se utilizan conaplicaciones Java externas.

Consideraciones de codificación para la entrada de datos XML en una base de datos:

La codificación interna y externa debe tenerse en cuenta al almacenar datos XML en una tabla de DB2.

Deben observarse las reglas siguientes:v Para los datos XML codificados externamente (datos que se envían al servidor de bases de datos

utilizando tipos de datos de carácter), cualquier declaración codificada internamente debe coincidir conla codificación externa; de lo contrario se produce un error y el gestor de bases de datos rechaza eldocumento.

v Para los datos XML codificados internamente (datos que se envían al servidor de bases de datosutilizando tipos de datos binarios), la aplicación debe asegurarse de que los datos contieneninformación de codificación exacta.

Consideraciones de codificación para la recuperación de datos XML de una base de datos:

Al recuperar datos XML de una tabla de DB2, debe evitar la pérdida y el truncamiento de datos. Lapérdida de datos puede producirse cuando los caracteres de los datos de origen no se pueden representaren la codificación de los datos de destino. El truncamiento puede producirse cuando la conversión al tipode datos de destino provoca la expansión de los datos.

60 IBM i: Programación SQL XML

Page 69: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Consideraciones de codificación para pasar datos XML en parámetros de rutinas:

En un sistema de base de datos DB2, están disponibles varios tipos de datos XML para los parámetros deun procedimiento almacenado o definición de función definida por el usuario.

Están disponibles los siguientes tipos de datos XML:

XML Para procedimientos y funciones SQL.

XML ASPara procedimientos externos y funciones externas definidas por el usuario.

Los datos de los parámetros XML AS están sujetos a la conversión de caracteres. Puede utilizarsecualquier tipo de datos de carácter o gráficos de la aplicación para los parámetros de la aplicación de querealiza la llamada, pero los datos de origen no deben contener una declaración de codificación. Puedenproducirse conversiones de CCSID adicionales, que pueden provocar que la información de codificaciónsea inexacta. Si los datos se analizan con mayor detalle en la aplicación, puede producirse la corrupciónde los datos.

Consideraciones de codificación para datos XML en aplicaciones JDBC y SQLJ:

Generalmente, existen menos consideraciones de codificación XML para las aplicaciones Java que para lasaplicaciones de SQL incorporado o CLI. Aunque las consideraciones de codificación para datos XMLcodificados internamente son las mismas para todas las aplicaciones, la situación se simplifica para losdatos codificados externamente en aplicaciones Java debido a que el CCSID de la aplicación siempre esUnicode.

Recomendaciones generales para la entrada de datos XML en aplicaciones Java

v Si los datos de entrada se encuentran en un archivo, lea los datos en una corriente binaria(setBinaryStream), de modo que el gestor de bases de datos los procese como datos codificadosinternamente.

v Si los datos de entrada se encuentran en una variable de aplicación Java, la elección del tipo devariable de aplicación determina si el gestor de bases de datos DB2 utiliza alguna codificación interna.Si especifica los datos como un tipo de carácter (por ejemplo, setString), el gestor de bases de datosconvierte los datos de UTF-16 (el CCSID de la aplicación) al CCSID de la columna XML antes dealmacenarlos.

Recomendaciones generales para la salida de datos XML en aplicaciones Java

v Si almacena los datos XML en un archivo como datos no binarios, debe añadir codificación internaXML a los datos de salida.La codificación del sistema de archivos puede no ser Unicode, de modo que los datos de tipo seriepueden experimentar una conversión cuando se almacenan en el archivo.En el caso de una función XMLSERIALIZE explícita con INCLUDING XMLDECLARATION, elservidor de bases de datos añade la codificación y el controlador JDBC no la modifica.

v Si la aplicación envía los datos de salida a un analizador XML, debe recuperar los datos en unavariable de aplicación binaria, con la codificación UTF-8, UCS-2 o UTF-16.

Efectos de la codificación y serialización XML sobre la conversión de datosEl método de especificación de la codificación de los datos XML, interna o externamente, y el método deserialización XML afectan a la conversión de los datos XML al pasar los datos entre una base de datos yuna aplicación.

Programación SQL XML 61

Page 70: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Escenarios de codificación para la entrada de datos XML codificados internamente en una base dedatos:

Los ejemplos siguientes muestran cómo afecta la codificación interna a la conversión y truncamiento dedatos durante la entrada de datos XML en una columna XML.

En general, el uso de un tipo de datos de aplicación binario minimiza los problemas de conversión depágina de códigos durante la entrada en una base de datos.

Escenario 1

Origen decodificación Valor

Codificación de datos Datos de entrada UTF-8 Unicode, con o sin una declaración de codificación XML o UTF-8BOM

Tipo de datos devariable host

Binario

CCSID declarado devariable host

No aplicable

Ejemplo de sentencias de entrada:INSERT INTO T1 (XMLCOL) VALUES (?)INSERT INTO T1 (XMLCOL) VALUES

(XMLPARSE(DOCUMENT CAST(? AS BLOB) PRESERVE WHITESPACE))

Conversión de caracteres: Ninguna.

Pérdida de datos: Ninguna.

Truncamiento: Ninguno.

Escenario 2

Origen decodificación Valor

Codificación de datos Datos de entrada UTF-16 Unicode que contienen una declaración de codificación XML oUTF-16 BOM

Tipo de datos devariable host

Binario

CCSID declarado devariable host

No aplicable

Ejemplo de sentencias de entrada:INSERT INTO T1 (XMLCOL) VALUES (?)INSERT INTO T1 (XMLCOL) VALUES

(XMLPARSE(DOCUMENT CAST(? AS BLOB) PRESERVE WHITESPACE))

Conversión de caracteres: el servidor de bases de datos DB2 convierte los datos de UTF-16 a UTF-8 cuandorealiza el análisis XML para el almacenamiento en una columna XML UTF-8.

Pérdida de datos: Ninguna.

Truncamiento: Ninguno.

62 IBM i: Programación SQL XML

Page 71: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Escenario 3

Origen decodificación Valor

Codificación de datos Datos de entrada ISO-8859-1 que contienen una declaración de codificación XML

Tipo de datos devariable host

Binario

CCSID declarado devariable host

No aplicable

Ejemplo de sentencias de entrada:INSERT INTO T1 (XMLCOL) VALUES (?)INSERT INTO T1 (XMLCOL) VALUES

(XMLPARSE(DOCUMENT CAST(? AS BLOB) PRESERVE WHITESPACE))

Conversión de caracteres: el sistema de bases de datos DB2 convierte los datos del CCSID 819 a UTF-8cuando realiza el análisis XML para el almacenamiento en una columna XML UTF-8.

Pérdida de datos: Ninguna.

Truncamiento: Ninguno.

Escenario 4

Origen decodificación Valor

Codificación de datos Datos de entrada Shift_JIS que contienen una declaración de codificación XML

Tipo de datos devariable host

Binario

CCSID declarado devariable host

No aplicable

Ejemplo de sentencias de entrada:INSERT INTO T1 (XMLCOL) VALUES (?)INSERT INTO T1 (XMLCOL) VALUES

(XMLPARSE(DOCUMENT CAST(? AS BLOB) PRESERVE WHITESPACE))

Conversión de caracteres: el sistema de bases de datos DB2 convierte los datos del CCSID 943 a UTF-8cuando realiza el análisis XML para el almacenamiento en una columna XML UTF-8.

Pérdida de datos: Ninguna.

Truncamiento: Ninguno.

Escenarios de codificación para la entrada de datos XML codificados externamente en una base dedatos:

Los ejemplos siguientes muestran cómo afecta la codificación externa a la conversión y truncamiento dedatos durante la entrada de datos XML en una columna XML.

En general, al utilizar un tipo de datos de aplicación de carácter, no hay ningún problema con laconversión del CCSID durante la entrada en una base de datos.

Programación SQL XML 63

Page 72: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Sólo los escenarios 1 y 2 son aplicables a Java, ya que la página de códigos de aplicación para Java essiempre Unicode porque las series de caracteres en Java son siempre Unicode.

Escenario 1

Origen decodificación Valor

Codificación de datos Datos de entrada UTF-8 Unicode, con o sin una declaración de codificación adecuada o BOM

Tipo de datos devariable host

Carácter

CCSID declarado devariable host

1208 (UTF-8)

Ejemplo de sentencias de entrada:INSERT INTO T1 (XMLCOL) VALUES (?)INSERT INTO T1 (XMLCOL) VALUES

(XMLPARSE(DOCUMENT CAST(? AS CLOB) PRESERVE WHITESPACE))

Conversión de caracteres: Ninguna.

Pérdida de datos: Ninguna.

Truncamiento: Ninguno.

Escenario 2

Origen decodificación Valor

Codificación de datos Datos de entrada UTF-16 Unicode, con o sin una declaración de codificación adecuada o BOM

Tipo de datos devariable host

Gráfico

CCSID declarado devariable host

1200 o 13488

Ejemplo de sentencias de entrada:INSERT INTO T1 (XMLCOL) VALUES (?)INSERT INTO T1 (XMLCOL) VALUES

(XMLPARSE(DOCUMENT CAST(? AS DBCLOB) PRESERVE WHITESPACE))

Conversión de caracteres: el sistema de bases de datos DB2 convierte los datos de UTF-16 a UTF-8 cuandorealiza el análisis XML para el almacenamiento en una columna XML UTF-8.

Pérdida de datos: Ninguna.

Truncamiento: Puede producirse durante la conversión de UTF-16 a UTF-8 debido a la expansión.

Escenario 3

Origen decodificación Valor

Codificación de datos Datos de entrada ISO-8859-1, con o sin una declaración de codificación adecuada

Tipo de datos devariable host

Carácter

64 IBM i: Programación SQL XML

Page 73: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Origen decodificación Valor

CCSID declarado devariable host

819

Ejemplo de sentencias de entrada:INSERT INTO T1 (XMLCOL) VALUES (?)INSERT INTO T1 (XMLCOL) VALUES

(XMLPARSE(DOCUMENT CAST(? AS CLOB) PRESERVE WHITESPACE))

Conversión de caracteres: el sistema de bases de datos DB2 convierte los datos del CCSID 819 a UTF-8cuando realiza el análisis XML para el almacenamiento en una columna XML UTF-8.

Pérdida de datos: Ninguna.

Truncamiento: Ninguno.

Escenario 4

Origen decodificación Valor

Codificación de datos Datos de entrada Shift_JIS, con o sin una declaración de codificación adecuada

Tipo de datos devariable host

Gráfico

CCSID declarado devariable host

943

Ejemplo de sentencias de entrada:INSERT INTO T1 VALUES (?)INSERT INTO T1 VALUES

(XMLPARSE(DOCUMENT CAST(? AS DBCLOB)))

Conversión de caracteres: el sistema de bases de datos DB2 convierte los datos del CCSID 943 a UTF-8cuando realiza el análisis XML para el almacenamiento en una columna XML UTF-8.

Pérdida de datos: Ninguna.

Truncamiento: Ninguno.

Escenarios de codificación para la recuperación de datos XML con serialización implícita:

Los ejemplos siguientes muestran cómo la codificación de destino y la página de códigos de la aplicaciónafectan a la conversión, el truncamiento y la codificación interna de datos durante la recuperación dedatos XML con serialización implícita.

Sólo los escenarios 1 y 2 son aplicables a las aplicaciones Java, ya que la página de códigos de aplicaciónpara las aplicaciones Java es siempre Unicode porque las series de caracteres en Java son siempreUnicode.

Programación SQL XML 65

Page 74: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Escenario 1

Origen decodificación Valor

Codificación de datosde destino

UTF-8 Unicode

Tipo de datos devariable host dedestino

Binario

CCSID declarado devariable host

No aplicable

Ejemplo de sentencias de salida:SELECT XMLCOL FROM T1

Conversión de caracteres: Ninguna.

Pérdida de datos: Ninguna.

Truncamiento: Ninguno.

Codificación interna en los datos serializados: para aplicaciones que no son Java, se especifica la siguientedeclaración XML como prefijo de los datos:<?xml version="1.0" encoding="UTF-8" ?>

Para las aplicaciones Java, no se añade ninguna declaración de codificación, a menos que convierta losdatos como el tipo com.ibm.db2.jcc.DB2Xml y utilice un método getDB2Xmlxxx para recuperar los datos.La declaración que se añade depende del getDB2Xmlxxx que utilice.

Escenario 2

Origen decodificación Valor

Codificación de datosde destino

UTF-16 Unicode

Tipo de datos devariable host dedestino

Gráfico

CCSID declarado devariable host

1200 o 13488

Ejemplo de sentencias de salida:SELECT XMLCOL FROM T1

Conversión de caracteres: los datos se convierten de UTF-8 a UTF-16.

Pérdida de datos: Ninguna.

Truncamiento: puede producirse durante la conversión de UTF-8 a UTF-16, debido a la expansión.

Codificación interna en los datos serializados: para aplicaciones que no sean Java o .NET, los datos tienencomo prefijo una marca de orden de bytes (BOM) UTF-16 y la declaración XML siguiente:<?xml version="1.0" encoding="UTF-16" ?>

66 IBM i: Programación SQL XML

Page 75: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Para las aplicaciones Java, no se añade ninguna declaración de codificación, a menos que convierta losdatos como el tipo com.ibm.db2.jcc.DB2Xml y utilice un método getDB2Xmlxxx para recuperar los datos.La declaración que se añade depende del getDB2Xmlxxx que utilice.

Escenario 3

Origen decodificación Valor

Codificación de datosde destino

Datos ISO-8859-1

Tipo de datos devariable host dedestino

Carácter

CCSID declarado devariable host

819

Ejemplo de sentencias de salida:SELECT XMLCOL FROM T1

Conversión de caracteres: los datos se convierten de UTF-8 a CCSID 819.

Pérdida de datos: Posible pérdida de datos. Algunos caracteres UTF-8 no pueden representarse en el CCSID819. El sistema de base de datos DB2 genera un error.

Truncamiento: Ninguno.

Codificación interna en los datos serializados:, se especifica la siguiente declaración XML como prefijo de losdatos:<?xml version="1.0" encoding="ISO-8859-1" ?>

Escenario 4

Origen decodificación Valor

Codificación de datosde destino

Datos Windows-31J (superconjunto de Shift_JIS)

Tipo de datos devariable host dedestino

Gráfico

CCSID declarado devariable host

943

Ejemplo de sentencias de salida:SELECT XMLCOL FROM T1

Conversión de caracteres: los datos se convierten de UTF-8 a CCSID 943.

Pérdida de datos: Posible pérdida de datos. Algunos caracteres UTF-8 no pueden representarse en el CCSID943. El sistema de base de datos DB2 genera un error.

Truncamiento: Puede producirse durante la conversión de UTF-8 al CCSID 943 debido a la expansión.

Programación SQL XML 67

Page 76: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Codificación interna en los datos serializados:, se especifica la siguiente declaración XML como prefijo de losdatos:<?xml version="1.0" encoding="Windows-31J" ?>

Escenarios de codificación para la recuperación de datos XML con XMLSERIALIZE explícita:

Los ejemplos siguientes muestran cómo la codificación de destino y la página de códigos de la aplicaciónafectan a la conversión, el truncamiento y la codificación interna de datos durante la recuperación dedatos XML con una invocación a XMLSERIALIZE explícita.

Sólo los escenarios 1 y 2 son aplicables a las aplicaciones Java y .NET, ya que la página de códigos deaplicación para las aplicaciones Java es siempre Unicode.

Escenario 1

Origen decodificación Valor

Codificación de datosde destino

UTF-8 Unicode

Tipo de datos devariable host dedestino

Binario

CCSID declarado devariable host

No aplicable

Ejemplo de sentencias de salida:SELECT XMLSERIALIZE(XMLCOL AS BLOB(1M) INCLUDING XMLDECLARATION) FROM T1

Conversión de caracteres: Ninguna.

Pérdida de datos: Ninguna.

Truncamiento: Ninguno.

Codificación interna en los datos serializados:, se especifica la siguiente declaración XML como prefijo de losdatos:<?xml version="1.0" encoding="UTF-8" ?>

Escenario 2

Origen decodificación Valor

Codificación de datosde destino

UTF-16 Unicode

Tipo de datos devariable host dedestino

Gráfico

CCSID declarado devariable host

1200 o 13488

Ejemplo de sentencias de salida:SELECT XMLSERIALIZE(XMLCOL AS CLOB(1M) EXCLUDING XMLDECLARATION) FROM T1

68 IBM i: Programación SQL XML

Page 77: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Conversión de caracteres: los datos se convierten de UTF-8 a UTF-16.

Pérdida de datos: Ninguna.

Truncamiento: puede producirse durante la conversión de UTF-8 a UTF-16, debido a la expansión.

Codificación interna en los datos serializados: Ninguna, ya que se especifica EXCLUDINGXMLDECLARATION. Si se especifica INCLUDING XMLDECLARATION, la codificación interna indicaUTF-8 en lugar de UTF-16. Esto puede generar datos XML que no pueden ser analizados por los procesosde aplicación que se basan en el nombre de la codificación.

Escenario 3

Origen decodificación Valor

Codificación de datosde destino

Datos ISO-8859-1

Tipo de datos devariable host dedestino

Carácter

CCSID declarado devariable host

819

Ejemplo de sentencias de salida:SELECT XMLSERIALIZE(XMLCOL AS CLOB(1M) EXCLUDING XMLDECLARATION) FROM T1

Conversión de caracteres: los datos se convierten de UTF-8 a CCSID 819.

Pérdida de datos: Posible pérdida de datos. Algunos caracteres UTF-8 no pueden representarse en el CCSID819. Si un carácter no puede representarse en el CCSID 819, el gestor de base de datos DB2 inserta uncarácter de sustitución en la salida y emite un aviso.

Truncamiento: Ninguno.

Codificación interna en los datos serializados: Ninguna, ya que se especifica EXCLUDINGXMLDECLARATION. Si se especifica INCLUDING XMLDECLARATION, el gestor de bases de datosañade codificación interna para UTF-8 en lugar de ISO-8859-1. Esto puede generar datos XML que nopueden ser analizados por los procesos de aplicación que se basan en el nombre de la codificación.

Escenario 4

Origen decodificación Valor

Codificación de datosde destino

Datos Windows-31J (superconjunto de Shift_JIS)

Tipo de datos devariable host dedestino

Gráfico

CCSID declarado devariable host

943

Ejemplo de sentencias de salida:SELECT XMLSERIALIZE(XMLCOL AS CLOB(1M) EXCLUDING XMLDECLARATION) FROM T1

Programación SQL XML 69

Page 78: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Conversión de caracteres: los datos se convierten de UTF-8 a CCSID 943.

Pérdida de datos: Posible pérdida de datos. Algunos caracteres UTF-8 no pueden representarse en el CCSID943. Si un carácter no puede representarse en el CCSID 943, el gestor de base de datos inserta un carácterde sustitución en la salida y emite un aviso.

Truncamiento: Puede producirse durante la conversión de UTF-8 al CCSID 943 debido a la expansión.

Codificación interna en los datos serializados: Ninguna, ya que se especifica EXCLUDINGXMLDECLARATION. Si se especifica INCLUDING XMLDECLARATION, la codificación interna indicaUTF-8 en lugar de Windows-31J. Esto puede generar datos XML que no pueden ser analizados por losprocesos de aplicación que se basan en el nombre de la codificación.

Correlaciones de nombres de codificación con los CCSID efectivos para datosXML almacenadosSi los datos que se almacenan en una columna XML se encuentran en una variable de aplicación binaria oson de un tipo XML codificado internamente, el gestor de bases de datos DB2 examina los datos paradeterminar la codificación. Si los datos tienen una declaración de codificación, el gestor de bases de datoscorrelaciona el nombre de codificación con un CCSID.

La API QlgCvtTextDescToDesc se utiliza para la correlación del nombre de codificación IANA con elCCSID.

Correlaciones de CCSID con nombres de codificación para datos de salida XMLserializadosComo parte de una operación XMLSERIALIZE implícita o explícita, el gestor de base de datos DB2 añadeuna declaración de codificación al principio de los datos de salida XML serializados.

Esta declaración tiene el formato siguiente:<?xml version="1.0" encoding="nombre-codificación"?>

En general, el identificador de juego de caracteres de la declaración de codificación describe lacodificación de los caracteres en la serie de salida. Por ejemplo, cuando se serializan datos XML en elCCSID correspondiente al tipo de datos de la aplicación de destino, la declaración de codificacióndescribe el CCSID de las variables de la aplicación de destino.

Siempre que es posible, el gestor de base de datos DB2 elige el nombre de registro IANA para el CCSID,como prescribe el estándar XML. La API QlgCvtTextDescToDesc se utiliza para la correlación el CCSIDcon el nombre de codificación IANA.

Descomposición de esquemas XML anotadosLa descomposición de esquemas XML anotados, también conocida como "descomposición" o"fragmentación", es el proceso de almacenar contenido de un documento XML en columnas de tablasrelacionales. La descomposición de esquemas XML anotados opera en función de las anotacionesespecificadas en un esquema XML. Una vez descompuesto un documento XML, los datos insertadostienen el tipo de datos SQL de la columna en la que se insertan.

Un esquema XML consta de uno o más documentos de esquema XML. En la descomposición deesquemas XML anotados, o descomposición basada en esquemas, la descomposición se controla anotandoel esquema XML de un documento con anotaciones de descomposición. Estas anotaciones especificandetalles como:v el nombre de la tabla y columna de destino donde deben almacenarse los datos XMLv el esquema SQL predeterminado para cuando no se identifique el esquema SQL de una tabla de

destino

70 IBM i: Programación SQL XML

Page 79: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v cualquier transformación del contenido antes de que se almacene

Consulte el resumen de las anotaciones de descomposición para obtener más ejemplos de lo que puedeespecificarse mediante estas anotaciones.

Los documentos de esquema anotado se deben almacenar y registrar en el repositorio de esquemas XML(XSR). A continuación, el esquema debe habilitarse para la descomposición.

Tras el registro satisfactorio del esquema anotado, la descomposición puede realizarse llamando alprocedimiento almacenado de descomposición.

Los datos del documento XML se validan siempre durante la descomposición. Si la información de undocumento XML no cumple con su especificación en un esquema XML, los datos no se insertan en latabla.

Descomposición de documentos XML con esquemas XML anotadosSi desea almacenar partes de un documento XML en columnas de una o más tablas, puede utilizar ladescomposición de esquemas XML anotados. Este tipo de descomposición divide un documento XML enfragmentos para el almacenamiento en tablas, en función de las anotaciones especificadas en un esquemaXML anotado registrado.

Para descomponer documentos XML utilizando esquemas XML anotados:1. Anote los documentos de esquema con anotaciones de descomposición XML.2. Registre los documentos de esquema y habilite el esquema para la descomposición.3. Si alguno de los documentos de esquema registrados que pertenecen al esquema XML ha cambiado,

todos los documentos de esquema XML de este esquema XML deben registrarse de nuevo y elesquema XML debe volver a habilitarse para la descomposición.

4. Descomponga el documento XML llamando al procedimiento almacenadoSYSPROC.XDBDECOMPXML.

Registro y habilitación de esquemas XML para la descomposiciónUna vez que un esquema anotado se ha registrado y habilitado satisfactoriamente para ladescomposición, puede utilizarlo para descomponer documentos XML.v Asegúrese de que al menos una declaración de elemento o atributo del esquema XML esté anotada con

una anotación de descomposición XML. Este elemento o atributo anotado debe ser un descendiente de,o ser él mismo, un elemento global de tipo complejo.

Para registrar y habilitar esquemas XML para la descomposición:1. Llame al procedimiento almacenado XSR_REGISTER, pasando el documento de esquema primario.2. Si el esquema XML consta de más de un documento de esquema, llame al procedimiento almacenado

XSR_ADDSCHEMADOC para cada uno de los documentos de esquema que todavía no se hanregistrado.

3. Llame al procedimiento almacenado XSR_COMPLETE con el parámetro issuedfordecompositionestablecido en 1.

Orígenes de descomposición de esquemas XML anotadosLa descomposición de esquemas XML anotados puede realizarse en elementos o atributos de undocumento XML, y en los resultados de las anotaciones db2-xdb:contentHandling o db2-xdb:expression.

La descomposición de esquemas XML anotados admite la descomposición de los siguientes tipos decontenido:v El valor de un atributo o elemento del documento XML.

Programación SQL XML 71

Page 80: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v El valor de un elemento del documento XML, donde el contenido exacto depende del valor de laanotación <db2-xdb:contentHandling>. Los valores de <db2-xdb:contentHandling> son:

text Datos de tipo carácter del elemento, pero no de sus descendientes

stringValueDatos de tipo carácter del elemento y sus descendientes

serializedSubtreeCódigos de todo el contenido entre la etiqueta de inicio y la etiqueta de final del elemento

v Valores que se generan a través de la anotación db2-xdb:expression:– Un valor que se basa en el contenido de un atributo o elemento correlacionado del documento XML.– Un valor generado que es independiente de los valores del documento XML.– Una constante.

Una expresión que se especifica a través de db2-xdb:expression se invoca una vez para cada elementoo atributo con el que está asociado.

anotaciones de descomposición XMLLa descomposición de esquemas XML anotados se basa en las anotaciones añadidas a los documentos deesquema XML. Estas anotaciones de descomposición funcionan como correlaciones entre los elementos oatributos del documento XML y sus tablas y columnas de destino en la base de datos. El proceso dedescomposición hace referencia a estas anotaciones para determinar cómo descomponer un documentoXML.

Las anotaciones de descomposición XML pertenecen al espacio de nombres http://www.ibm.com/xmlns/prod/db2/xdb1 y se identifican con el prefijo "db2-xdb" en toda la documentación. Puedeseleccionar su propio prefijo; sin embargo, si lo hace, debe enlazar el prefijo al espacio de nombressiguiente: http://www.ibm.com/xmlns/prod/db2/xdb1. El proceso de descomposición sólo reconoce lasanotaciones que están bajo este espacio de nombres en el momento de habilitar el esquema XML para ladescomposición.

El proceso de descomposición sólo reconoce las anotaciones de descomposición si se añaden adeclaraciones de elemento y atributo, o como anotaciones globales, en el documento de esquema. Seespecifican como atributos o como parte de un elemento hijo <xs:annotation> de la declaración deelemento o atributo. Las anotaciones añadidas a tipos complejos, referencias u otras construcciones deesquema XML se ignoran.

Aunque estas anotaciones existen en los documentos de esquema XML, no afectan a la estructura originaldel documento de esquema, ni tampoco participan en la validación de los documentos XML. Sólo elproceso de descomposición XML hace referencia a ellas.

Dos anotaciones que son características principales del proceso de descomposición son: db2-xdb:rowSet ydb2-xdb:column. Estas anotaciones especifican respectivamente la tabla y la columna de destino del valordescompuesto. Estas dos anotaciones deben especificarse en orden para que el proceso de descomposiciónse complete satisfactoriamente. Otras anotaciones son opcionales, pero pueden utilizarse para controlarcon mayor detalle el funcionamiento del proceso de descomposición.

Especificación y ámbito de las anotaciones de descomposición XMLPuede especificar anotaciones para la descomposición como declaraciones de elemento o atributo en undocumento de esquema XML.

Puede hacerlo de cualquiera de las formas siguientes:v Como atributos simples en declaraciones de elemento o atributov Como elementos hijo estructurados (complejos) de las declaraciones de elemento o atributo simple

72 IBM i: Programación SQL XML

Page 81: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Anotaciones como atributosLas anotaciones especificadas como atributos simples en declaraciones de elemento o atributo se aplicanúnicamente al elemento o atributo en el que se han especificado.

Por ejemplo, las anotaciones de descomposición db2-xdb:rowSet y db2-xdb:column pueden especificarsecomo atributos. Estas anotaciones se especificarían del siguiente modo:<xs:element name="isbn" type="xs:string"

db2-xdb:rowSet="TEXTBOOKS" db2-xdb:column="ISBN"/>

Las anotaciones db2-xdb:rowSet y db2-xdb:column se aplican sólo a este elemento denominado isbn.

Anotaciones como elementos hijo estructuradosLas anotaciones especificadas como elementos hijo estructurados de una declaración de elemento oatributo deben especificarse en el documento de esquema dentro de la jerarquía<xs:annotation><xs:appinfo></xs:appinfo></xs:annotation> definida por el esquema XML.

Por ejemplo, las anotaciones db2-xdb:rowSet y db2-xdb:column pueden especificarse como elementos hijo(son hijos de la anotación <db2-xdb:rowSetMapping>) de la forma siguiente:<xs:element name="isbn" type="xs:string">

<xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>TEXTBOOKS</db2-xdb:rowSet><db2-xdb:column>ISBN</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo>

</xs:annotation></xs:element>

La especificación de las anotaciones db2-xdb:rowSet y db2-xdb:column como elementos hijo esequivalente a especificarlas como atributos. Aunque más detallada que el método de especificaranotaciones como atributos, la especificación de anotaciones como elementos hijo es necesaria cuando esnecesario especificar más de un <db2-xdb:rowSetMapping> para un elemento o un atributo; es decir,cuando es necesario especificar varias correlaciones en la misma declaración de elemento o atributo.

Anotaciones globalesCuando una anotación se especifica como hijo del elemento <xs:schema>, es una anotación global que seaplica a todos los documentos de esquema XML que forman el esquema XML.

Por ejemplo, la anotación <db2-xdb:defaultSQLSchema> indica el esquema SQL predeterminado paratodas las tablas no calificadas referenciadas en el esquema XML. <db2-xdb:defaultSQLSchema> debeespecificarse como elemento hijo de <xs:schema>:<xs:schema>

<xs:annotation><xs:appinfo>

<db2-xdb:defaultSQLSchema>admin</db2-xdb:defaultSQLSchema></xs:appinfo>

</xs:annotation>...

</xs:schema>

Esta declaración especifica que todas las tablas no calificadas de todos los documentos de esquema queforman este esquema XML tendrán el esquema SQL "admin".

Anotaciones de descomposición XML - ResumenDB2 da soporte a un conjunto de anotaciones utilizado por el proceso de descomposición del esquemaXML anotado para correlacionar los elementos y atributos de un documento XML con las tablas de bases

Programación SQL XML 73

Page 82: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

de datos de destino. El siguiente resumen de algunas de las anotaciones de descomposición XML seagrupa por las tareas y acciones que las anotaciones deben realizar.

Para obtener más información acerca de una anotación específica, consulte la documentación detalladasobre ella.

Tabla 6. Especificación del esquema SQL

Acción Anotación de descomposición XML

Especificar el esquema SQL predeterminado para todaslas tablas que no especifican su esquema SQL

db2-xdb:defaultSQLSchema

Especificar un esquema SQL diferente delpredeterminado para una tabla específica

db2-xdb:table (elemento hijo <db2-xdb:SQLSchema>)

Tabla 7. Correlación de elementos o atributos XML con tablas base de destino

Acción Anotación de descomposición XML

Correlacionar un único elemento o atributo con un únicopar de columna y tabla

db2-xdb:rowSet con db2-xdb:column como anotacionesde atributo o db2-xdb:rowSetMapping

Correlacionar un único elemento o atributo con uno omás pares de columna y tabla diferenciados

db2-xdb:rowSetMapping

Correlacionar varios elementos o atributos con un únicopar de columna y tabla

db2-xdb:table

Especificar dependencias de orden entre tablas dedestino

db2-xdb:rowSetOperationOrder, db2-xdb:rowSet,db2-xdb:order

Tabla 8. Especificación de los datos XML que deben descomponerse

Acción Anotación de descomposición XML

Especificar el tipo de contenido que debe insertarse paraun elemento de tipo complejo (texto, serie o marcación)

db2-xdb:contentHandling

Especificar cualquier transformación de contenido quedebe aplicarse antes de la inserción

db2-xdb:normalization, db2-xdb:expression,db2-xdb:truncate

Filtrar los datos que deben descomponerse en funcióndel contenido del elemento o del contexto en el queaparece

db2-xdb:condition db2-xdb:locationPath

Anotación de descomposición db2-xdb:defaultSQLSchemaLa anotación db2-xdb:defaultSQLSchema especifica el esquema SQL predeterminado para todos losnombres de tabla referenciados en el esquema XML que no están calificados explícitamente utilizando laanotación db2-xdb:table.

Tipo de anotación

Elemento hijo de <xs:appinfo> que es un hijo de un elemento global <xs:annotation>.

Cómo se especifica

db2-xdb:defaultSQLSchema se especifica de la forma siguiente (donde valor representa un valor válidopara la anotación):<xs:schema>

<xs:annotation><xs:appinfo>

<db2-xdb:defaultSQLSchema>valor</db2-xdb:defaultSQLSchema>

74 IBM i: Programación SQL XML

Page 83: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

</xs:appinfo></xs:annotation>...

</xs:schema>

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Valores válidos

Un nombre de esquema SQL ordinario o delimitado. Los nombres de esquema SQL ordinarios o nodelimitados no son sensibles a mayúsculas y minúsculas. Para especificar un esquema SQL delimitado,utilice comillas, que suelen utilizarse para delimitar los identificadores de SQL. Los nombres de esquemaSQL que contienen los caracteres especiales '<' y '&' deben especificarse con caracteres de escape en eldocumento de esquema XML.

Detalles

Todas las tablas referenciadas en esquemas anotados deben calificarse con su esquema SQL. Las tablas sepueden calificar de dos formas, ya sea explícitamente especificando el elemento hijo <db2-xdb:SQLSchema> de la anotación <db2-xdb:table> o utilizando la anotación global <db2-xdb:defaultSQLSchema>. Para cualquier nombre de tabla no calificado, el valor especificado en<db2-xdb:defaultSQLSchema> se utiliza como su nombre de esquema SQL. Si varios documentos deesquema de un esquema anotado especifican esta anotación, todos los valores deben ser los mismos.

Ejemplo

El ejemplo siguiente muestra cómo se define el identificador de SQL ordinario o no delimitado admincomo el esquema de SQL para todas las tablas no calificadas en el esquema anotado:<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:db2-xdb="http://www.ibm.com/xmlns/prod/db2/xdb1"><xs:annotation>

<xs:appinfo><db2-xdb:defaultSQLSchema>admin</db2-xdb:defaultSQLSchema>

</xs:appinfo></xs:annotation>...

</xs:schema>

El ejemplo siguiente muestra cómo se define el identificador de SQL delimitado admin schema como elesquema de SQL para todas las tablas no calificadas en el esquema anotado. Tenga en cuenta que adminschema debe estar delimitado con comillas:<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:db2-xdb="http://www.ibm.com/xmlns/prod/db2/xdb1"><xs:annotation>

<xs:appinfo><db2-xdb:defaultSQLSchema>"admin schema"</db2-xdb:defaultSQLSchema>

</xs:appinfo></xs:annotation>...

</xs:schema>

Anotación de descomposición db2-xdb:rowSetLa anotación db2-xdb:rowSet especifica una correlación de elemento o atributo XML con una tabla basede destino.

Programación SQL XML 75

Page 84: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tipo de anotación

Atributo de <xs:element> o <xs:attribute>, o elemento hijo de <db2-xdb:rowSetMapping> o<db2-xdb:order>.

Cómo se especifica

db2-xdb:rowSet se especifica de cualquiera de las formas siguientes (donde valor representa un valorválido para la anotación):v <xs:element db2-xdb:rowSet="valor" />

v <xs:attribute db2-xdb:rowSet="valor" />v <db2-xdb:rowSetMapping>

<db2-xdb:rowSet>valor</db2-xdb:rowSet>

...</db2-xdb:rowSetMapping>

v <db2-xdb:order><db2-xdb:rowSet>

valor</db2-xdb:rowSet>...

</db2-xdb:order>

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Valores válidos

Cualquier identificador que se ajuste a las normas para los identificadores SQL. Consulte ladocumentación de identificadores para obtener más información.

Detalles

La anotación db2-xdb:rowSet correlaciona un elemento o atributo XML con una tabla base de destino.Esta anotación puede identificar un nombre de tabla directamente o identificar un nombre de rowSet encorrelaciones más complejas, donde el rowSet se asocia posteriormente con un nombre de tabla a travésde la anotación db2-xdb:table. En las correlaciones simples, esta anotación especifica el nombre de la tablaen la que debe descomponerse el valor. En correlaciones más complejas, donde varios rowSets (cada unocon un nombre diferenciado) se correlacionan con la misma tabla, esta anotación nombra el rowSet enlugar del nombre de tabla.

La tabla base de destino en la que se descompondrá el valor de este elemento o atributo XML estádeterminada por la presencia de otras anotaciones en el conjunto de documentos de esquema que formanel esquema anotado:v Si el valor de db2-xdb:rowSet no coincide con ninguno de los elementos hijo <db2-xdb:rowSet> de la

anotación global <db2-xdb:table>, el nombre de la tabla de destino es el valor especificado por estaanotación, calificado por un esquema SQL definido por la anotación global <db2-xdb:defaultSQLSchema>. Este uso de db2-xdb:rowSet es para el caso en el que, para una tabladeterminada, sólo haya un conjunto de elementos o atributos que se correlacione con la tabla.

v Si el valor de db2-xdb:rowSet coincide con un elemento hijo <db2-xdb:rowSet> de la anotación global<db2-xdb:table>, el nombre de la tabla de destino es la tabla indicada en el hijo <db2-xdb:name> de<db2-xdb:table>. Este uso de db2-xdb:rowSet es para el caso más complejo en el que, para una tabladeterminada, hay varios conjuntos de elementos o atributos (probablemente solapados) que secorrelacionan con esa tabla.

76 IBM i: Programación SQL XML

Page 85: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Importante: asegúrese de que la tabla a la que esta anotación hace referencia exista en la base de datoscuando el esquema XML se registre en el repositorio de esquemas XML. (Las columnas especificadas enlas anotaciones db2-xdb:column también debe existir al registrar el esquema XML.) Si la tabla no existe,se devuelve un error cuando el esquema XML se habilita para la descomposición. Si <db2-xdb:table>especifica un objeto que no es una tabla, también se devuelve un error.

Si se utiliza la anotación db2-xdb:rowSet, debe especificarse la anotación db2-xdb:column o la anotacióndb2-xdb:condition. La combinación de db2-xdb:rowSet y db2-xdb:column describe la tabla y la columnaen la que se descompondrá este elemento o atributo. La combinación de db2-xdb:rowSet ydb2-xdb:condition especifica la condición que debe cumplirse para que las filas de ese conjunto de filas seinserten en la tabla (por referencia directa o indirecta a través de la anotación <db2-xdb:table>).

Ejemplo

Hay dos formas de utilizar db2-xdb:rowSet.

Un solo conjunto de elementos o atributos correlacionados con una tabla

En la sección siguiente de un esquema anotado, supongamos que la tabla BOOKCONTENTS pertenece alesquema SQL especificado por <db2-xdb:defaultSQLSchema> y que no hay ningún elemento global<db2-xdb:table> actual que tenga un elemento hijo <db2-xdb:rowSet> que coincida con"BOOKCONTENTS".<xs:element name="book">

<xs:complexType><xs:sequence>

<xs:element name="authorID" type="xs:integer" /><xs:element name="chapter" type="chapterType" maxOccurs="unbounded" />

</xs:sequence><xs:attribute name="isbn" type="xs:string"

db2-xdb:rowSet="BOOKCONTENTS" db2-xdb:column="ISBN" /><xs:attribute name="title" type="xs:string" />

</xs:complexType></xs:element>

<xs:complexType name="chapterType"><xs:sequence>

<xs:element name="paragraph" type="paragraphType" maxOccurs="unbounded"db2-xdb:rowSet="BOOKCONTENTS" db2-xdb:column="CHPTCONTENT" />

</xs:sequence><xs:attribute name="number" type="xs:integer"

db2-xdb:rowSet="BOOKCONTENTS" db2-xdb:column="CHPTNUM" /><xs:attribute name="title" type="xs:string"

db2-xdb:rowSet="BOOKCONTENTS" db2-xdb:column="CHPTTITLE" /></xs:complexType>

<xs:simpleType name="paragraphType"><xs:restriction base="xs:string"/>

</xs:simpleType>

Considere el siguiente elemento de un documento XML:<book isbn="1-11-111111-1" title="Mi primer libro de XML">

<authorID>22</authorID><!-- esta publicación no tiene prefacio --><chapter number="1" title="Introducción a XML">

<paragraph>XML es divertido...</paragraph>...

</chapter><chapter number="2" title="XML y bases de datos">

<paragraph>XML puede utilizarse con...</paragraph></chapter>...<chapter number="10" title="Lecturas adicionales">

Programación SQL XML 77

Page 86: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<paragraph>Guías de aprendizaje recomendadas...</paragraph></chapter>...

</book>

La tabla BOOKCONTENTS se llena entonces de la siguiente manera:

Tabla 9. BOOKCONTENTS

ISBN CHPTNUM CHPTTITLE CHPTCONTENT

1-11-111111-1 1 Introducción a XML XML es divertido...

1-11-111111-1 2 XML y bases de datos XML puede utilizarse con...

... ... ... ...

1-11-111111-1 10 Lecturas adicionales Guías de aprendizajerecomendadas...

Varios conjuntos de elementos o atributos correlacionados con la misma tabla

En el caso de que exista un elemento hijo <db2-xdb:rowSet> de la anotación global <db2-xdb:table> quecoincida con el valor especificado en la anotación db2-xdb:rowSet, el elemento o atributo se correlacionacon una tabla mediante la anotación <db2-xdb:table>. En la sección siguiente de un esquema anotado,supongamos que la tabla ALLBOOKS pertenece al esquema SQL especificado por <db2-xdb:defaultSQLSchema>.<!-- anotación global --><xs:annotation>

<xs:appinfo><db2-xdb:table>

<db2-xdb:name>ALLBOOKS</db2-xdb:name><db2-xdb:rowSet>book</db2-xdb:rowSet><db2-xdb:rowSet>textbook</db2-xdb:rowSet>

</db2-xdb:table></xs:appinfo>

</xs:annotation>

<xs:element name="book"><xs:complexType>

<xs:sequence><xs:element name="authorID" type="xs:integer"

db2-xdb:rowSet="book" db2-xdb:column="AUTHORID" /><xs:element name="chapter" type="chapterType" maxOccurs="unbounded" />

</xs:sequence><xs:attribute name="isbn" type="xs:string"

db2-xdb:rowSet="book" db2-xdb:column="ISBN" /><xs:attribute name="title" type="xs:string"

db2-xdb:rowSet="book" db2-xdb:column="TITLE" /></xs:complexType>

</xs:element><xs:element name="textbook">

<xs:complexType><xs:sequence>

<xs:element name="isbn" type="xs:string"db2-xdb:rowSet="textbook" db2-xdb:column="ISBN" />

<xs:element name="title" type="xs:string"db2-xdb:rowSet="textbook" db2-xdb:column="TITLE" />

<xs:element name="primaryauthorID" type="xs:integer"db2-xdb:rowSet="textbook" db2-xdb:column="AUTHORID" />

<xs:element name="coauthorID" type="xs:integer"minOccurs="0" maxOccurs="unbounded" />

<xs:element name="subject" type="xs:string" /><xs:element name="edition" type="xs:integer" /><xs:element name="chapter" type="chapterType" maxOccurs="unbounded" />

</xs:sequence>

78 IBM i: Programación SQL XML

Page 87: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

</xs:complexType></xs:element>

<xs:complexType name="chapterType"><xs:sequence>

<xs:element name="paragraph" type="paragraphType" maxOccurs="unbounded" /></xs:sequence><xs:attribute name="number" type="xs:integer" /><xs:attribute name="title" type="xs:string" />

</xs:complexType>

<xs:simpleType name="paragraphType"><xs:restriction base="xs:string"/>

</xs:simpleType>

Considere los siguientes elementos de un documento XML:<book isbn="1-11-111111-1" title="Mi primer libro de XML">

<authorID>22</authorID><!-- esta publicación no tiene prefacio --><chapter number="1" title="Introducción a XML">

<paragraph>XML es divertido...</paragraph></chapter><chapter number="2" title="XML y bases de datos">

<paragraph>XML puede utilizarse con...</paragraph></chapter><chapter number="10" title="Lecturas adicionales">

<paragraph>Guías de aprendizaje recomendadas...</paragraph></chapter>

</book>

<textbook><isbn>0-11-011111-0</isbn><title>Programación con XML</title><primaryauthorID>435</primaryauthorID><subject>Programación</subject><edition>4</edition><chapter number="1" title="Conceptos básicos de programación">

<paragraph>Antes de programar...</paragraph></chapter><chapter number="2" title="Cómo escribir un programa">

<paragraph>Una vez aprendidos los conceptos básicos...</paragraph></chapter>...<chapter number="10" title="Técnicas avanzadas">

<paragraph>Puede aplicar técnicas avanzadas...</paragraph></chapter>

</textbook>

En este ejemplo, existen dos conjuntos de elementos o atributos que se correlacionan con la tablaALLBOOKS:v /book/@isbn, /book/@authorID, /book/titlev /textbook/isbn, /textbook/primaryauthorID, /textbook/title

Los conjuntos se distinguen asociando nombres de conjunto de filas diferentes con cada uno de ellos.

Tabla 10. ALLBOOKS

ISBN TITLE AUTHORID

1-11-111111-1 Mi primer libro de XML 22

0-11-011111-0 Programación con XML 435

Programación SQL XML 79

Page 88: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Anotación de descomposición db2-xdb:tableLa anotación db2-xdb:table correlaciona varios elementos o atributos XML con la misma columna dedestino, o permite especificar una tabla de destino que tiene un esquema SQL diferente del esquema SQLpredeterminado especificado por <db2-xdb:defaultSQLSchema>.

Tipo de anotación

Elemento hijo global de <xs:appinfo> (que es un elemento hijo de <xs:annotation>)

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Estructura válida

A continuación se indican los elementos hijo soportados de db2-xdb:table, por el orden en que debenaparecer si se especifican:

<db2-xdb:SQLSchema>(Opcional) El esquema SQL de la tabla.

<db2-xdb:name>El nombre de la tabla base. Este nombre de tabla, si está calificado con el valor de la anotación<db2-xdb:SQLSchema> anterior o de la anotación <db2-xdb:defaultSQLSchema>, debe serexclusivo entre todas las anotaciones <db2-xdb:table> del conjunto de documentos de esquemaXML que forman el esquema anotado.

<db2-xdb:rowSet>Todos los elementos y atributos que especifican el mismo valor para <db2-xdb:rowSet> formanuna fila. Debido a que puede especificarse más de un elemento <db2-xdb:rowSet> para el mismovalor de <db2-xdb:name>, más de un conjunto de correlaciones puede estar asociado con unasola tabla. La combinación del valor de <db2-xdb:rowSet> con las columnas especificadas en laanotación db2-xdb:column permite que más de un conjunto de elementos o atributos de un únicodocumento XML esté correlacionado con columnas de la misma tabla.

Para que la anotación sea válida, debe especificarse como mínimo un elemento<db2-xdb:rowSet>, y cada elemento <db2-xdb:rowSet> debe ser exclusivo entre todas lasanotaciones <db2-xdb:table> del conjunto de documentos de esquema XML que forman elesquema anotado.

Los espacios en blanco en el contenido de caracteres de los elementos hijo de db2-xdb:table essignificativo y no se normaliza. El contenido de estos elementos debe seguir las reglas de ortografía delos identificadores de SQL. Los valores no delimitados no son sensibles a las mayúsculas y minúsculas;para los valores delimitados, se utilizan comillas como delimitador. Los identificadores SQL quecontienen los caracteres especiales '<' y '&' deben especificarse con caracteres de escape.

Detalles

La anotación db2-xdb:table debe utilizarse en cualquiera de los casos siguientes:v cuando varias vías de acceso están correlacionadas con la misma columna de una tabla.v cuando la tabla que va a contener los datos descompuestos no tiene el mismo esquema SQL definido

por la anotación <db2-xdb:defaultSQLSchema>.

Sólo pueden especificarse tablas base; otros tipos de tablas, como por ejemplo tablas temporales o deconsulta materializadas, no están soportadas para esta correlación. Los alias de tabla y vistas no estánpermitidos para esta anotación.

80 IBM i: Programación SQL XML

Page 89: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo

El ejemplo siguiente muestra cómo puede utilizarse la anotación db2-xdb:table para agrupar elementos yatributos relacionados para formar una fila, cuando varias vías de acceso de ubicación se estáncorrelacionando con la misma columna. Considere en primer lugar los elementos siguientes de undocumento XML (modificado ligeramente a partir de los ejemplos utilizados para otras anotaciones).<root>

...<book isbn="1-11-111111-1" title="Mi primer libro de XML">

<authorID>22</authorID><email>[email protected]</email><!-- esta publicación no tiene prefacio --><chapter number="1" title="Introducción a XML">

<paragraph>XML es divertido...</paragraph>...

</chapter><chapter number="2" title="XML y bases de datos">

<paragraph>XML puede utilizarse con...</paragraph></chapter>...<chapter number="10" title="Lecturas adicionales">

<paragraph>Guías de aprendizaje recomendadas...</paragraph></chapter>

</book>...<author ID="0800" email="[email protected]">

<firstname>Alexander</firstname><lastname>Smith</lastname><activeStatus>0</activeStatus>

</author>...

<root>

Supongamos que el propósito de esta correlación de descomposición es insertar filas que constan de losID de autor y se sus direcciones de correo electrónico correspondientes en la misma tabla,AUTHORSCONTACT. Tenga en cuenta que los ID de autor y las direcciones de correo electrónicoaparecen tanto en el elemento <book> como en el elemento <author>. Por tanto, deberá correlacionar másde una vía de acceso de ubicación con las mismas columnas de la tabla misma. Por tanto, debe utilizarsela anotación <db2-xdb:table>. A continuación figura una sección del esquema anotado, que muestra cómose utiliza <db2-xdb:table> para asociar varias vías de acceso a la misma tabla.<!-- anotación global -->

<xs:annotation><xs:appinfo>

<db2-xdb:defaultSQLSchema>adminSchema</db2-xdb:defaultSQLSchema><db2-xdb:table>

<db2-xdb:SQLSchema>user1</db2-xdb:SQLSchema><db2-xdb:name>AUTHORSCONTACT</db2-xdb:name><db2-xdb:rowSet>bookRowSet</db2-xdb:rowSet><db2-xdb:rowSet>authorRowSet</db2-xdb:rowSet>

</db2-xdb:table></xs:appinfo>

</xs:annotation>

<xs:element name="book"><xs:complexType>

<xs:sequence><xs:element name="authorID" type="xs:integer"

db2-xdb:rowSet="bookRowSet" db2-xdb:column="AUTHID" /><xs:element name="email" type="xs:string"

db2-xdb:rowSet="bookRowSet" db2-xdb:column="EMAILADDR" /><xs:element name="chapter" type="chapterType" maxOccurs="unbounded" />

</xs:sequence><xs:attribute name="isbn" type="xs:string" /><xs:attribute name="title" type="xs:string" />

Programación SQL XML 81

Page 90: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

</xs:complexType></xs:element>

<xs:element name="author"><xs:complexType>

<xs:sequence><xs:element name="firstname" type="xs:string" /><xs:element name="lastname" type="xs:string" /><xs:element name="activeStatus" type="xs:boolean" />

</xs:sequence><xs:attribute name="ID" type="xs:integer"

db2-xdb:rowSet="authorRowSet" db2-xdb:column="AUTHID" /><xs:attribute name="email" type="xs:string"

db2-xdb:rowSet="authorRowSet" db2-xdb:column="EMAILADDR" /></xs:complexType>

</xs:element>

La anotación db2-xdb:table identifica el nombre de la tabla de destino para una correlación con elelemento hijo db2-xdb:name. En este ejemplo, AUTHORSCONTACT es la tabla de destino. Paraasegurarse de que el ID y las direcciones de correo electrónico del elemento <book> se mantienenseparados de los del elemento <author> (es decir, cada fila contiene valores relacionados lógicamente), seutiliza el elemento <db2-xdb:rowSet> para asociar elementos relacionados. Aunque en este ejemplo loselementos <book> y <author> son entidades separadas, puede haber casos en los que las entidades quedeben correlacionarse no sean independientes y requieran una separación lógica, que puede lograrsemediante el uso de rowSets.

Tenga en cuenta que la tabla AUTHORSCONTACT se encuentra en un esquema SQL diferente delesquema SQL predeterminado, y se utiliza el elemento <db2-xdb:SQLSchema> para especificarlo. Acontinuación se muestra la tabla AUTHORSCONTACT resultante:

Tabla 11. AUTHORSCONTACT

AUTHID EMAILADDR

22 [email protected]

0800 [email protected]

Anotación de descomposición db2-xdb:columnLa anotación db2-xdb:column especifica un nombre de columna de la tabla con la que se hacorrelacionado un elemento o atributo XML.

Tipo de anotación

Atributo de <xs:element> o <xs:attribute>, o elemento hijo de <db2-xdb:rowSetMapping>

Cómo se especifica

db2-xdb:column se especifica de cualquiera de las formas siguientes (donde valor representa un valorválido para la anotación):v <xs:element db2-xdb:rowSet="valor" db2-xdb:column="valor" />

v <xs:attribute db2-xdb:rowSet="valor" db2-xdb:column="valor" />

v <db2-xdb:rowSetMapping><db2-xdb:rowSet>valor</db2-xdb:rowSet><db2-xdb:column>valor</db2-xdb:column>...

</db2-xdb:rowSetMapping>

82 IBM i: Programación SQL XML

Page 91: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Valores válidos

Cualquier nombre de columna de la tabla base.

Detallesv Los nombres de columna no delimitados no son sensibles a las mayúsculas y minúsculas.v Cuando hay caracteres especiales, como por ejemplo comillas dobles ("), el carácter (&), o signos de

menor que (<) que forman parte de los identificadores de SQL, dichos caracteres especiales deben sersustituidos por sus notaciones XML equivalentes. Por ejemplo, sustituya " por &quot;, & por &amp; y< por &lt;.

v db2-xdb:column es un elemento hijo opcional de db2-xdb:rowSetMapping si la anotacióndb2-xdb:locationPath está presente.

Ejemplo

El ejemplo siguiente muestra cómo el contenido del elemento <book> puede insertarse en columnas deuna tabla denominada BOOKCONTENTS utilizando la anotación db2-xdb:column. En primer lugar figurauna sección del esquema anotado.<xs:element name="book">

<xs:complexType><xs:sequence>

<xs:element name="authorID" type="xs:integer" /><xs:element name="chapter" type="chapterType" maxOccurs="unbounded" />

</xs:sequence><xs:attribute name="isbn" type="xs:string"

db2-xdb:rowSet="BOOKCONTENTS" db2-xdb:column="ISBN" /><xs:attribute name="title" type="xs:string" />

</xs:complexType></xs:element>

<xs:complexType name="chapterType"><xs:sequence>

<xs:element name="paragraph" type="paragraphType" maxOccurs="unbounded"db2-xdb:rowSet="BOOKCONTENTS"db2-xdb:column="CHPTCONTENT" />

</xs:sequence><xs:attribute name="number" type="xs:integer"

db2-xdb:rowSet="BOOKCONTENTS"db2-xdb:column="CHPTNUM" />

<xs:attribute name="title" type="xs:string"db2-xdb:rowSet="BOOKCONTENTS"db2-xdb:column="CHPTTITLE" />

</xs:complexType>

<xs:simpleType name="paragraphType"><xs:restriction base="xs:string"/>

</xs:simpleType>

A continuación figura el elemento <book> que se está correlacionando, seguido de la tablaBOOKCONTENTS resultante una vez finalizada la descomposición.<book isbn="1-11-111111-1" title="Mi primer libro de XML">

<authorID>22</authorID><!-- esta publicación no tiene prefacio --><chapter number="1" title="Introducción a XML">

<paragraph>XML es divertido...</paragraph>...

</chapter>

Programación SQL XML 83

Page 92: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<chapter number="2" title="XML y bases de datos"><paragraph>XML puede utilizarse con...</paragraph>

</chapter>...<chapter number="10" title="Lecturas adicionales">

<paragraph>Guías de aprendizaje recomendadas...</paragraph></chapter>

</book>

Tabla 12. BOOKCONTENTS

ISBN CHPTNUM CHPTTITLE CHPTCONTENT

1-11-111111-1 1 Introducción a XML XML es divertido...

1-11-111111-1 2 XML y bases de datos XML puede utilizarse con...

... ... ... ...

1-11-111111-1 10 Lecturas adicionales Guías de aprendizajerecomendadas...

Anotación de descomposición db2-xdb:locationPathLa anotación db2-xdb:locationPath correlaciona un elemento o atributo XML con diferentes pares de tablay columna, dependiendo de la vía de acceso del elemento o atributo.

La anotación db2-xdb:locationPath se utiliza para describir las correlaciones de los elementos o atributosque están declarados globalmente o como parte de:v Un grupo de modelos definidov Un grupo de atributos definidv Una declaración de tipo complejo globalv Un elemento o atributo global de tipo simple o complejo

Tipo de anotación

Atributo de <xs:element> o <xs:attribute>, o atributo de <db2-xdb:rowSetMapping>>.

Cómo se especifica

db2-xdb:locationPath se especifica de cualquiera de las formas siguientes (donde valor representa un valorválido para la anotación):v <xs:element db2-xdb:locationPath="valor" />

v <xs:attribute db2-xdb:locationPath="valor" />

v

<db2-xdb:rowSetMapping> db2-xdb:locationPath="valor"><db2-xdb:rowSet>valor</db2-xdb:rowSet>...

</db2-xdb:rowSetMapping>>

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Valores válidos

El valor de db2-xdb:locationPath debe tener la siguiente sintaxis:

84 IBM i: Programación SQL XML

Page 93: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

�� �/ nombre / nombreprefijo : prefijo :

@ nombreprefijo :

��

nombreUn nombre de elemento o atributo.

prefijoUn prefijo de espacio de nombres.

El prefijo de espacio de nombres debe estar asociado con un espacio de nombres en el documentode esquema que contiene la anotación con db2-xdb:locationPath. Un enlace de prefijo de espaciode nombres puede crearse añadiendo una declaración de espacio de nombres al elemento<xs:schema> del documento de esquema.

Detalles

En las declaraciones de elemento o atributo que no se pueden reutilizar (las declaraciones locales que noforman parte de definiciones de tipo complejo definidas o grupos de modelos o atributos definidos), laanotación db2-xdb:locationPath no tiene ningún efecto.

db2-xdb:locationPath debe utilizarse cuando se utilizan declaraciones de elemento o atributo global comoreferencia desde otras vías de acceso (por ejemplo: <xs:element ref="abc">). Dado que las anotaciones nopueden especificarse directamente en las referencias, deben especificarse en la declaración de atributo oelemento global correspondiente. Puede hacerse referencia a un elemento o atributo global desde muchoscontextos diferentes dentro del esquema XML. En general, db2-xdb:locationPath debe utilizarse paradistinguir las correlaciones en contextos diferentes. Para tipos complejos, grupos de modelos y grupos deatributos definidos, las declaraciones de elemento y atributo deben anotarse para cada contexto en el queestán correlacionados para la descomposición. La anotación db2-xdb:locationPath debe utilizarse paraespecificar par de columna y conjunto de filas de destino para cada vía de acceso. Puede utilizarse elmismo valor de db2-xdb:locationPath para pares de conjunto de filas y columna diferentes.

Si se especifican un espacio de nombres predeterminado y attributeFormDefault ="unqualified", lasanotaciones de descomposición para atributos no calificados se ignoran porque el proceso de anotacióntrata el atributo como si perteneciera al espacio de nombres predeterminado. Sin embargo, el valorattributeFormDetail = "unqualified" indica que el atributo realmente pertenece al espacio de nombresglobal. En este caso, la correlación de este atributo se ignora y no se inserta ningún valor.

Ejemplo

El ejemplo siguiente muestra cómo el mismo atributo puede correlacionarse con tablas diferentes según elcontexto en el que aparece. En primer lugar figura una sección del esquema anotado.

<!-- atributo global --><xs:attribute name="title" type="xs:string"

db2-xdb:rowSet="BOOKS"db2-xdb:column="TITLE"db2-xdb:locationPath="/books/book/@title">

<xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping> db2-xdb:locationPath="/books/book/chapter/@title"><db2-xdb:rowSet>BOOKCONTENTS</db2-xdb:rowSet><db2-xdb:column>CHPTTITLE</db2-xdb:column>

</db2-xdb:rowSetMapping>></xs:appinfo>

</xs:annotation></xs:attribute>

Programación SQL XML 85

Page 94: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<xs:element name="books"><xs:complexType>

<xs:sequence><xs:element name="book">

<xs:complexType><xs:sequence>

<xs:element name="authorID" type="xs:integer" /><xs:element name="chapter" type="chapterType" maxOccurs="unbounded" />

</xs:sequence><xs:attribute name="isbn" type="xs:string" /><xs:attribute ref="title" />

</xs:complexType></xs:element>

</xs:sequence></xs:complexType>

</xs:element>

<xs:complexType name="chapterType"><xs:sequence>

<xs:element name="paragraph" type="paragraphType" maxOccurs="unbounded" /></xs:sequence><xs:attribute name="number" type="xs:integer" /><xs:attribute ref="title" />

</xs:complexType>

<xs:simpleType name="paragraphType"><xs:restriction base="xs:string"/>

</xs:simpleType>

Observe que sólo hay una declaración de atributo denominado "title", pero hay dos referencias a esteatributo en distintos contextos. Una referencia procede del elemento <book>, y la otra del elemento<chapter>. El valor del atributo "title" debe descomponerse en tablas diferentes en función del contexto.Este esquema anotado especifica que un valor de "title" se descompone en la tabla BOOKS si es un títulode publicación y en la tabla BOOKCONTENTS si es un título de capítulo.

A continuación figura el elemento <books> que se está correlacionando, seguido de la tabla BOOKSresultante una vez finalizada la descomposición.<books>

<book isbn="1-11-111111-1" title="Mi primer libro de XML"><authorID>22</authorID><!-- esta publicación no tiene prefacio --><chapter number="1" title="Introducción a XML">

<paragraph>XML es divertido...</paragraph>...

</chapter><chapter number="2" title="XML y bases de datos">

<paragraph>XML puede utilizarse con...</paragraph></chapter>...<chapter number="10" title="Lecturas adicionales">

<paragraph>Guías de aprendizaje recomendadas...</paragraph></chapter>

</book>...</books>

Tabla 13. BOOKS

ISBN TITLE CONTENT

NULL Mi primer libro de XML NULL

86 IBM i: Programación SQL XML

Page 95: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 14. BOOKCONTENTS

ISBN CHPTNUM CHPTTITLE CHPTCONTENT

NULL NULL Introducción a XML NULL

NULL NULL XML y bases de datos NULL

... ... ... ...

NULL NULL Lecturas adicionales NULL

Anotación de descomposición db2-xdb:expressionLa anotación db2-xdb:expression especifica una expresión personalizada, cuyo resultado se inserta en latabla con la que está correlacionado este elemento.

Tipo de anotación

Atributo de <xs:element> o <xs:attribute>, o elemento hijo opcional de <db2-xdb:rowSetMapping>,efectivo sólo en las anotaciones que incluyen una columna de correlación

Cómo se especifica

db2-xdb:expression se especifica de cualquiera de las formas siguientes (donde valor representa un valorválido para la anotación):v <xs:element db2-xdb:expression="valor" db2-xdb:column="valor" />

v <xs:attribute db2-xdb:expression="valor" db2-xdb:column="valor" />

v

<db2-xdb:rowSetMapping><db2-xdb:rowSet>valor</db2-xdb:rowSet><db2-xdb:column>valor</db2-xdb:column><db2-xdb:expression>valor</db2-xdb:expression>...

</db2-xdb:rowSetMapping>

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Valores válidos

El valor de db2-xdb:expression debe tener la siguiente sintaxis, que constituye un subconjunto deexpresiones SQL:

expresión:

Programación SQL XML 87

Page 96: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

�� �

,

nombre-función ( expresión )constante$DECOMP_CONTENT$DECOMP_DOCUMENTID( selección completa-escalar )expresión + expresión

-*/CONCAT

( expresión )registro-especialCAST ( expresión AS tipo-datos )función-XML

��

Detalles

La anotación db2-xdb:expression permite especificar una expresión personalizada, que se aplica alcontenido del elemento o atributo XML que se anota cuando se utiliza $DECOMP_CONTENT. Elresultado de evaluar esta expresión se inserta en la columna que se ha especificado durante ladescomposición.

db2-xdb:expression es útil en los casos en que desea insertar valores constantes (como el nombre de unelemento) o valores generados que no aparecen en el documento.

db2-xdb:expression debe especificarse utilizando expresiones SQL válidas, y el tipo de la expresiónevaluada debe ser determinable estáticamente y compatible con el tipo de la columna de destino en laque debe insertarse el valor. El siguiente subconjunto de expresiones SQL está soportado; las demásexpresiones SQL no descritas a continuación no están soportados y tienen un comportamiento indefinidoen el contexto de esta anotación.

Los nombres de esquema, nombres de tabla y nombres de columna de la anotación db2-xdb:expressiondeben utilizar la denominación SQL para la calificación y son sensibles a las mayúsculas y minúsculassólo si los nombres están delimitados.

función ( lista-expresiones )Función escalar SQL incorporada o definida por el usuario. Una función escalar devuelve un solovalor (posiblemente nulo).

constanteUn valor que es una constante de tipo serie o una constante numérica.

$DECOMP_CONTENTEl valor del elemento o atributo XML correlacionado del documento, construido según el valor dela anotación db2-xdb:contentHandling.

$DECOMP_DOCUMENTIDEl valor de serie especificado en el parámetro de entrada id_documento del procedimientoalmacenado XDBDECOMPXML, que identifica el documento XML que se descompone.

( selección completa-escalar )Una fullselect entre paréntesis que devuelve una única fila que consta de un único valor decolumna. Si fullselect no devuelve una fila, el resultado de la expresión es el valor NULL:

expresión operador expresiónEl resultado de dos operandos de expresión soportados, según lo definido en la lista de valoressoportados anterior.

88 IBM i: Programación SQL XML

Page 97: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

( expresión )Una expresión especificada entre paréntesis que se ajusta a la lista de expresiones soportadasdefinidas anteriormente.

registro-especialEl nombre de un registro especial soportado. Este valor se evalúa como el valor del registroespecial para el servidor actual.

CAST ( expresión AS tipo-datos )La conversión de la expresión al tipo de datos SQL especificado, si la expresión no es nula. Si laexpresión es nula, el resultado es un valor nulo del tipo de datos SQL especificado. Al insertar unvalor NULL en una columna, la expresión debe convertir NULL en un tipo de columnacompatible (por ejemplo: CAST (NULL AS INTEGER), para una columna de entero).

función-XMLCualquier función SQL/XML soportada.

Ejemplo

Este ejemplo muestra los tipos de operaciones que puede realizar con anotaciones db2-xdb:expression. Elejemplo también muestra los casos en los que la entrada XML se debe convertir a un tipo SQL.

El documento XML de entrada tiene el aspecto siguiente:<num>1000.99</num>

El esquema XML anotado genera una fila para una tabla con la siguiente definición:CREATE TABLE TAB1

(ASIS DECIMAL(9,2),ADD INTEGER,TAX INTEGER,STR VARCHAR(25),LITERAL DECIMAL(5,1)SELECT VARCHAR(25))

El esquema XML anotado utiliza una tabla con la siguiente definición:CREATE TABLE SCH1.TAB2

(ID INTEGER,COL1 VARCHAR(25))

La tabla SCH1.TAB2 contiene una fila con los valores (100, 'TAB2COL1VAL').<xs:element name="num" type="xs:double">

<xs:annotation><xs:appinfo>

<xdb:rowSetMapping><xdb:rowSet>TAB1</xdb:rowSet><xdb:column>ASIS</xdb:column>

</xdb:rowSetMapping><xdb:rowSetMapping>

<xdb:rowSet>TAB1</xdb:rowSet><xdb:column>ADD</xdb:column><xdb:expression>

CAST(XDB.ADD(1234,CAST($DECOMP_CONTENT AS INTEGER)) AS INTEGER)</xdb:expression>

</xdb:rowSetMapping><xdb:rowSetMapping>

<xdb:rowSet>TAB1</xdb:rowSet><xdb:column>TAX</xdb:column><xdb:expression>

CAST(XDB.TAX(CAST($DECOMP_CONTENT AS DOUBLE)) AS INTEGER)</xdb:expression>

Programación SQL XML 89

Page 98: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

</xdb:rowSetMapping><xdb:rowSetMapping>

<xdb:rowSet>TAB1</xdb:rowSet><xdb:column>STR</xdb:column><xdb:expression>

CAST($DECOMP_CONTENT AS VARCHAR(25))</xdb:expression>

</xdb:rowSetMapping><xdb:rowSetMapping>

<xdb:rowSet>TAB1</xdb:rowSet><xdb:column>LITERAL</xdb:column><xdb:expression>32.3</xdb:expression>

</xdb:rowSetMapping><xdb:rowSetMapping>

<xdb:rowSet>TAB1</xdb:rowSet><xdb:column>SELECT</xdb:column><xdb:expression>

(SELECT "COL1" FROM "SCH1"."TAB2" WHERE "ID" = 100)</xdb:expression>

</xdb:rowSetMapping></xs:appinfo>

</xs:annotation></xs:element>

Supongamos que existe una función definida por el usuario denominada AuthNumBooks que toma unparámetro entero, que representa el ID del autor y devuelve el número total de libros que el autor tieneen el sistema.

Tabla 15. TAB1

ASIS ADD TAX STR LITERAL SELECT

1000.99 2234 300 1000.99 32.3 TAB2COL1VAL

Anotación de descomposición db2-xdb:conditionLa anotación db2-xdb:condition especifica una condición que determina si una fila se insertará en unatabla. Una fila que satisface la condición puede insertarse (en función de otras condiciones para elconjunto de filas, si existen); una fila que no cumpla la condición no se insertará.

La condición se aplica independientemente de si la anotación a la que pertenece contiene una correlaciónde columnas.

Tipo de anotación

Atributo de <xs:element> o <xs:attribute>, o elemento hijo opcional de <db2-xdb:rowSetMapping>.

Cómo se especifica

db2-xdb:condition se especifica de cualquiera de las formas siguientes (donde valor representa un valorválido para la anotación):v <xs:element db2-xdb:condition="valor" />

v <xs:attribute db2-xdb:condition="valor" />v <db2-xdb:rowSetMapping>

<db2-xdb:rowSet>valor</db2-xdb:rowSet><db2-xdb:condition>valor</db2-xdb:condition>...

</db2-xdb:rowSetMapping>

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

90 IBM i: Programación SQL XML

Page 99: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Valores válidos

Predicados SQL de los tipos siguientes:v básicov cuantificadov BETWEENv DISTINCTv EXISTSv INv LIKEv NULL

Los predicados también deben constar de expresiones que estén soportadas por la anotacióndb2-xdb:expression, los nombres de columna o ambos.

Detalles

Si la anotación db2-xdb:condition se especifica en varias declaraciones de elemento o atributo del mismoconjunto de filas, la fila se insertará sólo cuando el AND lógico de todas las condiciones se evalúe comotrue.

Nombres de columna en db2-xdb:condition

Dado que db2-xdb:condition consta de predicados SQL, pueden especificarse nombres de columna enesta anotación. Si una anotación db2-xdb:condition que implica un conjunto de filas contiene un nombrede columna no calificado, debe existir una correlación con dicha columna entre todas las correlacionesque implican a ese conjunto de filas. Otros nombres de columna, si se utilizan en predicados quecontienen sentencias SELECT, deben estar calificados. Si db2-xdb:condition especifica un nombre decolumna no calificado, pero el elemento o atributo para el que se especifica db2-xdb:condition no tieneespecificada una correlación de columnas, cuando se evalúe la condición, el valor que se evalúa será elcontenido del elemento o atributo que se correlaciona con el nombre de columna referenciado.

Observe el ejemplo siguiente:<xs:element name="a" type="xs:string"

db2-xdb:rowSet="rowSetA" db2-xdb:condition="columnX=’abc’" /><xs:element name="b" type="xs:string"

db2-xdb:rowSet="rowSetB" db2-xdb:condition="columnX" />

Observe que <a> no tiene una correlación de columnas especificada, pero la condición hace referencia a lacolumna "columnX". Cuando se evalúa la condición ", columnX" en la condición se sustituirá por el valorde <b>, porque <b> ha especificado una correlación para "columnX", mientras que <a> no tiene unacorrelación de columnas. Si el documento XML contuviera:<a>abc</a><b>def</b>

la condición se evaluaría como false en este caso, ya que el valor de <b>, "def", se evalúa en la condición.

Si se utiliza $DECOMP_CONTENT (una palabra clave de descomposición que especifica el valor delelemento o atributo correlacionado como datos de tipo carácter) en lugar del nombre de columna en ladb2-xdb:condition asociada a la declaración del elemento <a>, la condición se evalúa utilizando el valorde <a>, en lugar de <b>.<xs:element name="a" type="xs:string"

db2-xdb:rowSet="rowSetA" db2-xdb:condition="$DECOMP_CONTENT=’abc’" /><xs:element name="b" type="xs:string"

db2-xdb:rowSet="rowSetB" db2-xdb:column="columnX" />

Programación SQL XML 91

Page 100: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Si el documento XML contuviera:<a>abc</a><b>def</b>

la condición se evaluaría como true en este caso, ya que el valor de <a>, "abc", se utiliza en la evaluación.

Este proceso condicional, utilizando nombres de columna y $DECOMP_CONTENT, puede ser útil en loscasos en los que se desea descomponer sólo un valor basado en el valor de otro elemento o atributo queno se insertará en la base de datos.

Condiciones especificadas en elementos o atributos correlacionados ausentes deldocumento

Si se especifica una condición en un elemento o un atributo, pero dicho elemento o atributo no apareceen el documento XML, la condición se sigue aplicando. Por ejemplo, considere la siguiente correlación deelementos de un documento de esquema anotado:<xs:element name="intElem" type="xs:integer"

db2-xdb:rowSet="rowSetA" db2-xdb:column="colInt"db2-xdb:condition="colInt > 100" default="0" />

Si el elemento <intElem> no aparece en el documento XML, la condición "colInt > 100" se sigueevaluando. Dado que <intElem> no aparece, se utiliza un valor predeterminado de 0 en la evaluación decondición para "colInt". A continuación, la condición se evalúa como: 0 > 100, que se evalúa como false.Por tanto, la fila correspondiente no se inserta durante la descomposición.

Ejemplo

Considere el siguiente elemento <author> de un documento XML:<author ID="0800">

<firstname>Alexander</firstname><lastname>Smith</lastname><activeStatus>1</activeStatus>

</author>

Dependiendo de las condiciones especificadas por db2-xdb:condition, los valores de este elemento<author> pueden o no insertarse en las tablas de destino durante la descomposición. A continuación sepresentan dos casos.

Se satisfacen todas las condiciones

La sección siguiente del esquema anotado que corresponde al elemento <author> anterior especifica queeste elemento sólo se debe descomponer si el ID del autor está entre 1 y 999, los elementos <firstname> y<lastname> no son NULL y el valor del elemento <activeStatus> es igual a 1:<xs:element name="author">

<xs:complexType><xs:sequence>

<xs:element name="firstname" type="xs:string"db2-xdb:rowSet="AUTHORS" db2-xdb:column="GIVENNAME"db2-xdb:condition="$DECOMP_CONTENT IS NOT NULL" />

<xs:element name="lastname" type="xs:string"db2-xdb:rowSet="AUTHORS" db2-xdb:column="SURNAME"db2-xdb:condition="$DECOMP_CONTENT IS NOT NULL" />

<xs:element name="activeStatus" type="xs:integer"db2-xdb:rowSet="AUTHORS" db2-xdb:column="statusCode"db2-xdb:condition="$DECOMP_CONTENT=1" />

<xs:attribute name="ID" type="xs:integer"db2-xdb:rowSet="AUTHORS" db2-xdb:column="AUTHID"

92 IBM i: Programación SQL XML

Page 101: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

db2-xdb:condition="$DECOMP_CONTENT BETWEEN 1 and 999 /></xs:sequence>

</xs:complexType></xs:element>

Dado que todas las condiciones especificadas por db2-xdb:condition se cumplen con los valores delelemento <author> de ejemplo anterior, la tabla AUTHORS se llena con los datos del elemento <author>.

Tabla 16. AUTHORS

AUTHID GIVENNAME SURNAME STATUSCODE NUMBOOKS

0800 Alexander Smith 1 NULL

Una condición falla

El esquema anotado siguiente especifica que el elemento <author> sólo se debe descomponer si el ID delautor está entre 1 y 100 y los elementos <firstname> y <lastname> no son NULL:<xs:element name="author">

<xs:complexType><xs:sequence>

<xs:element name="firstname" type="xs:string"db2-xdb:rowSet="AUTHORS" db2-xdb:column="GIVENNAME"db2-xdb:condition="$DECOMP_CONTENT IS NOT NULL" />

<xs:element name="lastname" type="xs:string"db2-xdb:rowSet="AUTHORS" db2-xdb:column="SURNAME"db2-xdb:condition="$DECOMP_CONTENT IS NOT NULL"/>

<xs:element name="activeStatus" type="xs:integer" /><xs:attribute name="ID" type="xs:integer"

db2-xdb:rowSet="AUTHORS" db2-xdb:column="AUTHID"db2-xdb:condition="$DECOMP_CONTENT BETWEEN 1 and 100" />

</xs:sequence></xs:complexType>

</xs:element>

Aunque los elementos <firstname> y <lastname> del elemento <author> del ejemplo cumplen lascondiciones especificadas, no así el valor del atributo ID, por lo que la fila entera no se inserta durante ladescomposición. Esto se debe a que se evalúa el AND lógico de las tres condiciones especificadas en latabla AUTHORS. En este caso, una de las condiciones es false, por lo que el AND lógico se evalúa comofalse y, por lo tanto, no se insertan filas.

Anotación de descomposición db2-xdb:contentHandlingLa anotación db2-xdb:contentHandling especifica el tipo de contenido que se descompondrá en una tablapara un elemento de tipo complejo o de tipo simple.

Tipo de anotación

Atributo de <xs:element> o atributo de <db2-xdb:rowSetMapping>, que se aplica a las declaraciones deelemento de tipo simple o tipo complejo.

Cómo se especifica

db2-xdb:contentHandling se especifica de cualquiera de las formas siguientes (donde valor representa unvalor válido para la anotación):v <xs:element db2-xdb:contentHandling="valor" />v <db2-xdb:rowSetMapping db2-xdb:contentHandling="valor">

<db2-xdb:rowSet>valor</db2-xdb:rowSet>...

</db2-xdb:rowSetMapping>

Programación SQL XML 93

Page 102: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Valores válidos

Uno de los siguientes símbolos sensibles a las mayúsculas y minúsculas:v textv stringValuev serializeSubtree

Detalles

La anotación db2-xdb:contentHandling, especificada como un atributo en la declaración de un elementoXML, indica qué valor debe insertarse en las tablas y columnas especificadas por db2-xdb:rowSet ydb2-xdb:column, respectivamente, durante la descomposición.

Los tres valores válidos para db2-xdb:contentHandling son los siguientes:

text

v Qué se inserta: la concatenación de los datos de tipo carácter (incluido el contenido de tipocarácter de las secciones CDATA) dentro de este elemento.

v Qué se excluye: los comentarios e instrucciones de proceso de este elemento, delimitadores desección CDATA ("<![CDATA[" "] >"), así como los descendientes de este elemento (incluidos loscódigos y contenido).

stringValue

v Qué se inserta: la concatenación de los datos de tipo carácter de este elemento (incluido elcontenido de tipo carácter de las secciones CDATA) con los datos de carácter de losdescendientes del elemento, por orden de documento.

v Qué se excluye: comentarios, instrucciones de proceso, delimitadores de sección CDATA("<![CDATA[" "]]>") y códigos de inicio y final de los descendientes de este elemento.

serializeSubtree

v Qué se inserta: el código de todo lo que se encuentra entre los códigos de inicio y finalizaciónde este elemento, incluidos los códigos de inicio y final de este elemento. Esto incluyecomentarios, instrucciones de proceso y delimitadores de sección CDATA ("<![CDATA[" "]]>").

v Qué se excluye: nada.v Notas: la serie serializada que se inserta podría no ser idéntica a la sección correspondiente del

documento XML debido a factores tales como: valores predeterminados especificados en elesquema XML, expansión de entidades, el orden de los atributos, normalización de espacio enblanco de atributos y proceso de las secciones CDATA.Debido a que las series serializadas que resultan de este valor son una entidad XML, existenproblemas de CCSID que deben tenerse en cuenta. Si la columna de destino es de tipo caráctero gráfico, el fragmento XML se inserta en el CCSID de la columna. Cuando una aplicación pasauna entidad de este tipo a un procesador XML, la aplicación debe informar explícitamente alprocesador de la codificación de la entidad, ya que el procesador no detectará automáticamentelas codificaciones que no sean UTF-8. Si la columna de destino es de tipo BLOB, sin embargo,la entidad XML se inserta en la codificación UTF-8. En este caso, la entidad XML puedepasarse al procesador XML sin necesidad de especificar una codificación.

Si una declaración de elemento XML anotado para descomposición es de tipo complejo e incluyecontenido complejo pero no especifica db2-xdb:contentHandling, el comportamiento predeterminadosigue el valor "serializeSubtree". En todos los demás casos de declaraciones de elemento anotadas, elcomportamiento predeterminado si no se especifica db2-xdb:contentHandling sigue el valor "stringValue".

94 IBM i: Programación SQL XML

Page 103: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Si un elemento está declarado como de tipo complejo y tiene un modelo de contenido de elemento únicoo vacío (es decir, el atributo "mixed" de la declaración del elemento no está establecido en true o 1),db2-xdb:contentHandling no se puede establecer en "text".

La especificación de la anotación db2-xdb:contentHandling en un elemento no afecta a la descomposiciónde ninguno de los descendientes del elemento.

El valor de db2-xdb:contentHandling afecta al valor de sustitución de $DECOMP_CONTENT en lasanotaciones db2-xdb:expression o db2-xdb:condition. El valor sustituido se procesa primero según el valorde db2-xdb:contentHandling, antes de pasarlo para su evaluación.

Ejemplo

El ejemplo siguiente muestra cómo pueden utilizarse los distintos valores de la anotacióndb2-xdb:contentHandling para producir resultados diferentes en la tabla de destino. Primero se presentael esquema anotado, que muestra cómo el elemento <paragraph> se anota con db2-xdb:contentHandling.(El esquema anotado se presenta sólo una vez, con db2-xdb:contentHandling establecido en "text". En losejemplos subsiguientes de esta sección se presupone el mismo esquema anotado, y difieren sólo por elvalor con el que se establece db2-xdb:contentHandling.)<xs:schema>

<xs:element name="books"><xs:complexType>

<xs:sequence><xs:element name="book">

<xs:complexType><xs:sequence>

<xs:element name="authorID" type="xs:integer" /><xs:element name="chapter" type="chapterType" maxOccurs="unbounded" />

</xs:sequence><xs:attribute name="isbn" type="xs:string"

db2-xdb:rowSet="BOOKCONTENTS" db2-xdb:column="ISBN" /><xs:attribute name="title" type="xs:string" />

</xs:complexType></xs:element>

</xs:sequence></xs:complexType>

</xs:element>

<xs:complexType name="chapterType"><xs:sequence>

<xs:element name="paragraph" type="paragraphType" maxOccurs="unbounded"db2-xdb:rowSet="BOOKCONTENTS" db2-xdb:column="CHPTCONTENT"db2-xdb:contentHandling="text" />

</xs:sequence><xs:attribute name="number" type="xs:integer"

db2-xdb:rowSet="BOOKCONTENTS" db2-xdb:column="CHPTNUM" /><xs:attribute name="title" type="xs:string"

db2-xdb:rowSet="BOOKCONTENTS" db2-xdb:column="CHPTTITLE" /></xs:complexType>

<xs:complexType name="paragraphType" mixed="1"><xs:choice>

<xs:element name="b" type="xs:string" minOccurs="0" maxOccurs="unbounded" /></xs:choice>

</xs:complexType></xs:schema>

A continuación se presenta el elemento <books> que se correlaciona.<books>

<book isbn="1-11-111111-1" title="Mi primer libro de XML"><authorID>22</authorID><chapter number="1" title="Introducción a XML">

Programación SQL XML 95

Page 104: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<paragraph>XML es <b>muy</b> divertido...</paragraph></chapter><chapter number="2" title="XML y bases de datos">

<paragraph><!-- Inicio de capítulo -->XML puede utilizarse con...</paragraph><paragraph><?processInstr example?>

Caracteres de escape como <![CDATA[ <, >, y & ]]>...</paragraph></chapter>...<chapter number="10" title="Lecturas adicionales">

<paragraph>Guías de aprendizaje recomendadas...</paragraph></chapter>

</book>...

<books>

Las tres tablas siguientes muestran el resultado de la descomposición del mismo elemento XML condiferentes valores para db2-xdb:contentHandling.

Nota: Las tablas resultantes que figuran a continuación contienen comillas alrededor de los valores de lascolumnas CHPTTITLE y CHPTCONTENT. Estas comillas no existen en las columnas, sino que sepresentan aquí sólo para mostrar los límites y espacios en blanco de las series insertadas.

db2-xdb:contentHandling="text"

Tabla 17. BOOKCONTENTS

ISBN CHPTNUM CHPTTITLE CHPTCONTENT

1-11-111111-1 1 "Introducción a XML" "XML es divertido..."

1-11-111111-1 2 "XML y bases dedatos"

"XML puede utilizarse con..."

1-11-111111-1 2 "XML y bases dedatos"

"

Caracteres de escape como <, >, y& ..."

... ... ... ...

1-11-111111-1 10 "Lecturas adicionales" "Guías de aprendizaje recomendadas..."

Observe cómo el contenido del elemento <b> del primer párrafo del capítulo 1 no se inserta cuando seutiliza el valor "text". Esto es debido a que el valor "text" excluye cualquier contenido de losdescendientes. Observe también que el comentario y la instrucción de proceso del primer párrafo delcapítulo 2 se excluyen cuando se utiliza el valor "text". El espacio en blanco de la concatenación de losdatos de tipo carácter de los elementos <paragraph> se conserva.

db2-xdb:contentHandling="stringValue"

Tabla 18. BOOKCONTENTS

ISBN CHPTNUM CHPTTITLE CHPTCONTENT

1-11-111111-1 1 "Introducción a XML" "XML es muy divertido..."

1-11-111111-1 2 "XML y bases dedatos"

"XML puede utilizarse con..."

1-11-111111-1 2 "XML y bases dedatos"

"

Caracteres de escape como <, >, y& ..."

... ... ... ...

96 IBM i: Programación SQL XML

Page 105: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 18. BOOKCONTENTS (continuación)

ISBN CHPTNUM CHPTTITLE CHPTCONTENT

1-11-111111-1 10 "Lecturas adicionales" "Guías de aprendizaje recomendadas..."

La diferencia entre esta tabla y la tabla anterior se encuentra en la columna CHPTCONTENT de laprimera fila. Observe que se ha insertado la serie "muy", que procede del descendiente <b> del elemento<paragraph>. Cuando db2-xdb:contentHandling se estableció en "text", esta serie se excluía, porque elvalor "text" excluye el contenido de los descendientes. Sin embargo, el valor "stringValue" incluye elcontenido de los descendientes. Como en el valor "text", los comentarios e instrucciones de proceso no seinsertan y el espacio en blanco se conserva.

db2-xdb:contentHandling="serializeSubtree"

Tabla 19. BOOKCONTENTS

ISBN CHPTNUM CHPTTITLE CHPTCONTENT

1-11-111111-1 1 "Introducción a XML" "<paragraph>XML es <b>muy</b>divertido...</paragraph>"

1-11-111111-1 2 "XML y bases dedatos"

"<paragraph><!-- Inicio de capítulo -->XMLpuede utilizarse con...</paragraph>"

1-11-111111-1 2 "XML y bases dedatos"

"<paragraph><?processInstr example?>

Caracteres de escape como<![CDATA[ <, >, y & ]]>...</paragraph>"

... ... ... ...

1-11-111111-1 10 "Lecturas adicionales" "<paragraph>Guías de aprendizajerecomendadas...</paragraph>"

La diferencia entre esta tabla y los dos tablas anteriores es que se inserta todo el código de losdescendientes de los elementos <paragraph> (incluidos los códigos de inicio y finalización de<paragraph>). Esto incluye los códigos de inicio y finalización <b> de la columna CHPTCONTENT de laprimera fila, así como el comentario y la instrucción de proceso de las filas segunda y tercera,respectivamente. Al igual que en los dos ejemplos anteriores, el espacio en blanco del documento XML seha conservado.

Anotación de descomposición db2-xdb:normalizationLa anotación db2-xdb:normalization especifica la normalización del espacio en blanco en los datos XMLque deben insertarse o sustituirse para $DECOMP_CONTENT (cuando se utiliza con db2-xdb:expression).

Tipo de anotación

Atributo de <xs:element> o <xs:attribute>, o atributo de <db2-xdb:rowSetMapping>>.

Cómo se especifica

db2-xdb:normalization se especifica de cualquiera de las formas siguientes (donde valor representa unvalor válido para la anotación):v <xs:element db2-xdb:normalization="valor" />

v <xs:attribute db2-xdb:normalization="valor" />v <db2-xdb:rowSetMapping> db2-xdb:normalization="valor">

<db2-xdb:rowSet>valor</db2-xdb:rowSet>...

</db2-xdb:rowSetMapping>>

Programación SQL XML 97

Page 106: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Valores válidos

Uno de los siguientes símbolos sensibles a las mayúsculas y minúsculas:

canonicalAntes de insertar el valor XML en la columna de destino, o de sustituirlo en las apariciones de$DECOMP_CONTENT que se encuentran en la misma correlación que esta anotacióndb2-xdb:normalization, el valor XML se convierte a su formato canónico de acuerdo con su tipode esquema XML.

originalAntes de insertar el valor XML en la columna de destino, o de sustituirlo en las apariciones de$DECOMP_CONTENT que se encuentran en la misma correlación que esta anotacióndb2-xdb:normalization, no se realiza ninguna modificación del XML excepto el posible procesopor parte de un analizador XML. Es el valor predeterminado.

whitespaceStripAntes de insertar el valor XML en la columna de destino, o de sustituirlo en las apariciones de$DECOMP_CONTENT que se encuentran en la misma correlación que esta anotacióndb2-xdb:normalization:v Todos los espacios en blanco iniciales y finales se eliminan del valor XML.v Los espacios en blanco consecutivos se contraen para formar un único carácter de espacio en

blanco.

Detalles

db2-xdb:normalization es aplicable cuando un elemento o atributo tiene uno de los siguientes tipos deesquema XML atómicos:v byte, byte sin signov integer, positiveInteger, negativeInteger, nonPositiveInteger, nonNegativeIntegerv int, unsignedIntv long, unsignedLongv short, unsignedShortv decimalv floatv doublev booleanv timev datev dateTime

La columna de destino debe tener uno de los siguientes tipos de datos:v CHARv VARCHARv CLOBv DBCLOBv GRAPHICv VARGRAPHIC

98 IBM i: Programación SQL XML

Page 107: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

db2-xdb:normalization se ignorará si se especifica para cualquier otro tipo.

Ejemplo

El ejemplo siguiente muestra cómo puede controlarse la normalización de espacio en blanco con laanotación db2-xdb:normalization. En primer lugar figura el esquema anotado.

<xs:element name="author"><xs:complexType>

<xs:sequence><xs:element name="firstname" type="xs:string"

db2-xdb:rowSet="AUTHORS" db2-xdb:column="FIRSTNAME" /><xs:element name="lastname" type="xs:string"

db2-xdb:rowSet="AUTHORS" db2-xdb:column="SURNAME"db2-xdb:normalization="whitespaceStrip" />

<xs:element name="activeStatus" type="xs:boolean"db2-xdb:rowSet="AUTHORS" db2-xdb:column="ACTIVE"db2-xdb:normalization="canonical" />

<xs:attribute name="ID" type="xs:integer"db2-xdb:rowSet="AUTHORS" db2-xdb:column="AUTHID"db2-xdb:normalization="whitespaceStrip" />

</xs:sequence></xs:complexType>

</xs:element>

A continuación figura el elemento <author> que se correlaciona (los espacios en blanco significativos serepresentan mediante el carácter de subrayado '_' a efectos de demostración), seguido de la tablaAUTHORS resultante una vez completada la descomposición.<author ID="__22">

<firstname>Ann</firstname><lastname>__Brown_</lastname><activeStatus>1</activeStatus>

</author>

Tabla 20. AUTHORS

AUTHID FIRSTNAME SURNAME ACTIVE NUMBOOKS

22 Ann __Brown_ true NULL

La anotación db2-xdb:normalization="whitespaceStrip" en el atributo ID provoca la eliminación de losespacios en blanco inicial y final antes de insertar los datos en la tabla AUTHORS. La anotacióndb2-xdb:normalization.="canonical" del elemento <activeStatus> provoca que su valor booleano sesustituya por la representación canónica de ese valor antes de la inserción en la tabla AUTHORS. Elelemento tiene un tipo booleano. La representación canónica de un tipo booleano es true o false.

Anotación de descomposición db2-xdb:orderLa anotación db2-xdb:order especifica el orden de inserción de filas entre tablas diferentes.

Tipo de anotación

Elemento hijo de <db2-xdb:rowSetOperationOrder>.

Cómo se especifica

db2-xdb:order se especifica de la forma siguiente (donde valor representa un valor válido para laanotación):<xs:schema>

<xs:annotation><xs:appinfo>

<db2-xdb:rowSetOperationOrder>

Programación SQL XML 99

Page 108: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<db2-xdb:order><db2-xdb:rowSet>value</db2-xdb:rowSet>...

</db2-xdb:order></db2-xdb:rowSetOperationOrder>

</xs:appinfo></xs:annotation>...

</xs:schema>

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Estructura válida

A continuación se indican los elementos hijo de <db2-xdb:order> soportados:

db2-xdb:rowSetEspecifica una correlación de elemento o atributo XML con una tabla base de destino.

Detalles

La anotación db2-xdb:order se utiliza para definir el orden de inserción de las filas que pertenecen a unrowSet determinado en relación a las filas que pertenecen a otro rowSet. Esto permite que los datos XMLse inserten en las tablas de destino de forma coherente con las restricciones de integridad referencialdefinidas en las tablas como parte del esquema relacional. El número de elementos db2-xdb:rowSet quepueden aparecer en el elemento db2-xdb:order puede ser cualquier número superior a 1.

Todas las filas de un determinado rowSet RS1 se insertan antes de las filas pertenecientes a otro rowSetRS2 si RS1 se indica antes de RS2 dentro de db2-xdb:orden. Pueden especificarse varias instancias de esteelemento para definir varias jerarquías de orden de inserción. Para los rowSets que no aparezcan enningún elemento, sus filas se pueden insertar en cualquier orden relativo a las filas de cualquier otrorowSet. Además, el contenido de cada elemento <db2-xdb:rowSet> debe ser un rowSet definidoexplícitamente o el nombre de una tabla existente para la que no se haya realizado ninguna declaraciónexplícita de rowSet.

Pueden definirse varias jerarquías de inserción de rowSet, aunque un rowSet sólo puede aparecer en unainstancia del elemento <db2-xdb:order> y puede aparecer sólo una vez dentro de ese elemento.

Para los identificadores de SQL delimitados especificadas en los elementos hijo, debe incluirse eldelimitador de comillas en el contenido de caracteres, sin escapes. Sin embargo, los caracteres ‘&' y ‘<'utilizados en los identificadores de SQL deben especificarse con caracteres de escape.

Ejemplo

El ejemplo siguiente muestra la utilización de la anotación db2-xdb:order.<xs:schema>

<xs:annotation><xs:appinfo>

<db2-xdb:rowSetOperationOrder><db2-xdb:order>

<db2-xdb:rowSet>CUSTOMER</db2-xdb:rowSet><db2-xdb:rowSet>PURCHASE_ORDER</db2-xdb:rowSet>

</db2-xdb:order><db2-xdb:order>

<db2-xdb:rowSet>ITEMS_MASTER</db2-xdb:rowSet><db2-xdb:rowSet>PO_ITEMS</db2-xdb:rowSet>

</db2-xdb:order>

100 IBM i: Programación SQL XML

Page 109: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

</db2-xdb:rowSetOperationOrder></xs:appinfo>

</xs:annotation></xs:schema>

En el ejemplo anterior se especifican dos jerarquías no intersectadas para el orden de inserción. Laprimera jerarquía especifica que todo el contenido del rowSet o tabla CUSTOMER se inserta antes decualquier contenido recopilado para PURCHASE_ORDER, y la segunda jerarquía especifica que todo elcontenido del rowSet o tabla ITEMS_MASTER se insertará antes de insertar cualquier contenido enPO_ITEMS. Observe que el orden entre las dos jerarquías no está definido. Por ejemplo, cualquiercontenido del rowSet o tabla PURCHASE_ORDER puede insertarse antes o después de insertar cualquiercontenido en ITEMS_MASTER

Anotación de descomposición db2-xdb:truncateLa anotación db2-xdb:truncate especifica si se permite el truncamiento cuando se inserta un valor XML enuna columna de destino de tipo carácter.

Tipo de anotación

Atributo de <xs:element> o <xs:attribute>, o atributo de <db2-xdb:rowSetMapping>>.

Cómo se especifica

db2-xdb:truncate se especifica de cualquiera de las formas siguientes (donde valor representa un valorválido para la anotación):v <xs:element db2-xdb:truncate="valor" />

v <xs:attribute db2-xdb:truncate="valor" />v <db2-xdb:rowSetMapping> db2-xdb:truncate="valor">

<db2-xdb:rowSet>valor</db2-xdb:rowSet>...

</db2-xdb:rowSetMapping>>

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Valores válidos

Uno de los valores siguientes:

0 o falseEl valor no puede truncarse antes de la inserción; si el valor es demasiado largo, se produce unerror y el valor no se inserta. Es el valor predeterminado.

1 o trueEl valor puede truncarse antes de la inserción.

Detalles

Un valor XML que se inserta en una columna de caracteres de destino podría ser mayor que el tamañode la columna; en este caso, el valor debe truncarse para que la descomposición sea satisfactoria. Elatributo db2-xdb:truncate indica si se permite el truncamiento cuando el valor es demasiado grande parala columna de destino. Si este atributo se establece en "false" o "0" para indicar que el truncamiento noestá permitido, y el valor XML que se inserta es demasiado grande para la columna de destino, seproduce un error durante la descomposición del documento XML y el valor no se inserta. El valor "true"o "1" indica que el truncamiento de datos está permitido durante la inserción.

db2-xdb:truncate sólo es aplicable en las siguientes correlaciones:

Programación SQL XML 101

Page 110: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tipo de datos XML Tipo de datos de columna

Cualquier tipo compatible CHARVARCHARCLOBGRAPHICVARGRAPHICDBCLOB

xs:date DATE

xs:time TIME

xs:dateTime TIMESTAMP

Si la anotación db2-xdb:expression se especifica en la misma declaración de elemento o atributo quedb2-xdb:truncate, el valor de db2-xdb:truncate se ignora, ya que la expresión puede realizar eltruncamiento si se ha definido como tal.

Para las anotaciones que descomponen valores de fecha y hora XML en columnas DATE, TIME oTIMESTAMP, si los datos XML pueden tener un huso horario, db2-xdb:truncate debe establecerse en"true" o "1".

Ejemplo

El ejemplo siguiente muestra cómo puede aplicarse el truncamiento a un elemento <author>. En primerlugar figura una sección del esquema anotado.<xs:element name="author">

<xs:complexType><xs:sequence>

<xs:element name="firstname" type="xs:string"db2-xdb:rowSet="AUTHORS" db2-xdb:column="FIRSTNAME"db2-xdb:truncate="true" />

<xs:element name="lastname" type="xs:string" /><xs:element name="activeStatus" type="xs:boolean" /><xs:element name="activated" type="xs:date"

db2-xdb:truncate="true" /><xs:attribute name="ID" type="xs:integer" />

<xs:sequence></xs:complexType>

</xs:element>

A continuación figura el elemento <author> que se correlaciona.<author ID="0800">

<firstname>Alexander</firstname><lastname>Smith</lastname><activeStatus>0</activeStatus><activated>2001-10-31Z</activated>

</author>

Supongamos que la columna FIRSTNAME se ha definido con un tipo SQL CHAR de tamaño de 7 y quela columna ACTIVEDATE se ha definido con un tipo SQL DATE. A continuación figura la tablaAUTHORS resultante una vez completada la descomposición.

Tabla 21. AUTHORS

AUTHID FIRSTNAME SURNAME ACTIVE ACTIVEDATE NUMBOOKS

NULL Alexand NULL NULL 2001-10-31 NULL

dado que el valor de <firstname> "Alexander" es mayor que el tamaño de la columna SQL, eltruncamiento es necesario para poder insertar el valor. Observe también que debido a que el elemento

102 IBM i: Programación SQL XML

Page 111: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<activated> contiene un huso horario en el documento XML, db2-xdb:truncate se ha establecido en "true"para garantizar que la fecha se inserta satisfactoriamente durante la descomposición.

Dado que el truncamiento es necesario para insertar el valor del elemento <firstname> o del elemento<activated>, si no se ha especificado db2-xdb:truncate, se presupone el valor predeterminado dedb2-xdb:truncate (truncamiento no permitido) y se generaría un error para indicar que una fila no se hainsertado.

Anotación de descomposición db2-xdb:rowSetMappingLa anotación db2-xdb:rowSetMapping correlaciona un elemento o atributo XML con una única tabla ycolumna de destino, con varias columnas de destino de la misma tabla o con varias tablas y columnas.

Tipo de anotación

Elemento hijo de <xs:appinfo> (que es un elemento hijo de <xs:annotation>) que a su vez es un elementohijo de <xs:element> o <xs:attribute>

Cómo se especifica

db2-xdb:rowSetMapping se especifica de cualquiera de las formas siguientes (donde valor representa unvalor válido para la anotación):v <xs:element>

<xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>valor</db2-xdb:rowSet>...

</db2-xdb:rowSetMapping></xs:appinfo>

</xs:annotation>...

</xs:element>v <xs:attribute>

<xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>valor</db2-xdb:rowSet>...

</db2-xdb:rowSetMapping></xs:appinfo>

</xs:annotation>...

</xs:attribute>

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Estructura válida

A continuación se indican los atributos de <db2-xdb:rowSetMapping> soportados:

db2-xdb:contentHandlingPermite la especificación del tipo de contenido que se descompondrá en una tabla para unelemento de tipo complejo.

db2-xdb:locationPathPermite la correlación de un elemento o atributo XML declarado como parte de un gruporeutilizable con diferentes pares de tabla y columna, dependiendo del origen del elemento oatributo.

Programación SQL XML 103

Page 112: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

db2-xdb:normalizationPermite la especificación del comportamiento de normalización para el contenido del elemento oatributo XML correlacionado con una columna de destino de tipo carácter antes de insertar elcontenido.

db2-xdb:truncatePermite especificar si se permite el truncamiento cuando se inserta un valor XML en una columnade destino de tipo carácter.

A continuación se indican los elementos hijo soportados de <db2-xdb:rowSetMapping>, en el orden enque deben aparecer si se especifican:

<db2-xdb:rowSet>Correlaciona un elemento o atributo XML con una tabla base de destino.

<db2-xdb:column>Correlaciona un elemento o atributo XML con una columna de tabla base. Este elemento esopcional si está presente la anotación db2-xdb:condition o db2-xdb:locationPath.

<db2-xdb:expression>Especifica una expresión personalizada, cuyo resultado se inserta en la tabla indicada por elatributo db2-xdb:rowSet. Este elemento es opcional.

<db2-xdb:condition>Especifica una condición o evaluación. Este elemento es opcional.

Detalles

Si db2-xdb:expression y db2-xdb:truncate se especifican conjuntamente, db2-xdb:truncate se ignora.

Para la correlación con una sola tabla y columna, especificar db2-xdb:rowSetMapping es equivalente aespecificar una combinación de las anotaciones db2-xdb:rowSet y db2-xdb:column.

Todos los espacios en blanco en el contenido de caracteres de los elementos hijo de <db2-xdb:rowSetMapping> es significativo; no se realiza ninguna normalización de espacios en blanco. Para losidentificadores de SQL delimitados especificadas en los elementos hijo, debe incluirse el delimitador decomillas en el contenido de caracteres, sin escapes. Sin embargo, los caracteres ‘&' y ‘<' utilizados en losidentificadores de SQL deben especificarse con caracteres de escape.

Ejemplo

El ejemplo siguiente muestra cómo un único atributo, denominado "isbn", puede correlacionarse con másde una tabla con la anotación <db2-xdb:rowSetMapping>. En primer lugar figura una sección delesquema anotado. Muestra cómo el valor isbn se correlaciona con las tablas BOOKS y BOOKCONTENTS.<xs:element name="book">

<xs:complexType><xs:sequence>

<xs:element name="authorID" type="xs:integer"/><xs:element name="chapter" type="chapterType" maxOccurs="unbounded" />

</xs:sequence><xs:attribute name="isbn" type="xs:string">

<xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>BOOKS</db2-xdb:rowSet><db2-xdb:column>ISBN</db2-xdb:column>

</db2-xdb:rowSetMapping><db2-xdb:rowSetMapping>

<db2-xdb:rowSet>BOOKCONTENTS</db2-xdb:rowSet><db2-xdb:column>ISBN</db2-xdb:column>

</db2-xdb:rowSetMapping>

104 IBM i: Programación SQL XML

Page 113: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

</xs:appinfo></xs:annotation>

</xs:attribute><xs:attribute name="title" type="xs:string" />

</xs:complexType></xs:element>

A continuación figura el elemento <book> que se está correlacionando, seguido de las tablas BOOKS yBOOKCONTENTS resultantes una vez finalizada la descomposición.<book isbn="1-11-111111-1" title="Mi primer libro de XML">

<authorID>22</authorID><!-- esta publicación no tiene prefacio --><chapter number="1" title="Introducción a XML">

<paragraph>XML es divertido...</paragraph>...

</chapter>...

</book>

Tabla 22. BOOKS

ISBN TITLE CONTENT

1-11-111111-1 NULL NULL

Tabla 23. BOOKCONTENTS

ISBN CHPTNUM CHPTTITLE CHPTCONTENT

1-11-111111-1 NULL NULL NULL

Correlación alternativa utilizando una combinación de <db2-xdb:rowSetMapping> ydb2-xdb:rowSet y db2-xdb:column

La siguiente sección de un esquema anotado es equivalente al fragmento de esquema XML presentadoanteriormente, ya que genera los mismos resultados de descomposición. La diferencia entre los dosesquemas es que este esquema sustituye una correlación por la combinación de db2-xdb:rowSet ydb2-xdb:column, en lugar de utilizar sólo la anotación <db2-xdb:rowSetMapping>.<xs:element name="book">

<xs:complexType><xs:sequence>

<xs:element name="authorID" type="xs:integer"/><xs:element name="chapter" type="chapterType" maxOccurs="unbounded" />

</xs:sequence><xs:attribute name="isbn" type="xs:string"

db2-xdb:rowSet="BOOKS" db2-xdb:column="ISBN" ><xs:annotation>

<xs:appinfo><db2-xdb:rowSetMapping>

<db2-xdb:rowSet>BOOKCONTENTS</db2-xdb:rowSet><db2-xdb:column>ISBN</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo>

</xs:annotation></xs:attribute><xs:attribute name="title" type="xs:string" />

</xs:complexType></xs:element>

Anotación de descomposición db2-xdb:rowSetOperationOrderLa anotación db2-xdb:rowSetOperationOrder es un padre de uno o varios elementos db2-xdb:order.Consulte la sección dedicada a db2-xdb:order para obtener detalles sobre cómo definir el orden deinserción de filas entre diferentes tablas.

Programación SQL XML 105

Page 114: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tipo de anotación

Elemento hijo de <xs:appinfo> que es un hijo de un elemento global <xs:annotation>.

Cómo se especifica

db2-xdb:rowSetOperationOrder se especifica de la forma siguiente (donde valor representa un valorválido para la anotación):<xs:schema>

<xs:annotation><xs:appinfo>

<db2-xdb:rowSetOperationOrder><db2-xdb:order>

<db2-xdb:rowSet>value</db2-xdb:rowSet>...

</db2-xdb:order></db2-xdb:rowSetOperationOrder>

</xs:appinfo></xs:annotation>...

</xs:schema>

Espacio de nombres

http://www.ibm.com/xmlns/prod/db2/xdb1

Estructura válida

A continuación se indican los elementos hijo de <db2-xdb:rowSetOperationOrder> soportados:

db2-xdb:order

Detalles

<db2-xdb:rowSetOperationOrder> agrupa elementos <db2-xdb:order>. Puede haber varias instancias delelemento hijo <db2-xdb:order> presentes, que permiten la definición de varias jerarquías de inserción.

Al permitirle controlar el orden en que se inserta el contenido de los documentos XML, las anotacionesdb2-xdb:rowSetOperationOrder y db2-xdb:order juntas proporcionan una forma de garantizar que elproceso de descomposición del esquema XML respete las restricciones de integridad referencial en lastablas de destino, así como cualquier otro requisito de aplicación que indique que las filas de una tabladeben insertarse antes de filas de otra tabla.

La anotación db2-xdb:rowSetOperationOrder puede aparecer sólo una vez en un esquema XML.

Ejemplo

Consulte la sección “Anotación de descomposición db2-xdb:order” en la página 99 para ver ejemplos deespecificación del orden de inserción de rowSet.

Palabras clave para la descomposición de esquemas XML anotadosLa descomposición de esquemas XML anotados ofrece palabras clave de descomposición que se utilizanen las anotaciones db2-xdb:condition y db2-xdb:expression.

$DECOMP_CONTENTEl valor del elemento o atributo XML correlacionado desde el documento. El valor se construyesegún el valor de la anotación db2-xdb:contentHandling. El valor de $DECOMP_CONTENT es detipo carácter.

106 IBM i: Programación SQL XML

Page 115: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

$DECOMP_CONTENT puede utilizarse para procesar el valor del elemento o atributocorrelacionado utilizando expresiones personalizadas en lugar de insertar directamente ese valor.

Si db2-xdb:expression especifica $DECOMP_CONTENT y se especifica db2-xdb:normalization enla misma correlación, el valor de $DECOMP_CONTENT para db2-xdb:expression se normalizaantes de pasarlo a la expresión para su evaluación.

$DECOMP_DOCUMENTIDEl valor de serie especificado en el parámetro de entrada documentid del procedimientoalmacenado XDBDECOMPXML, que identifica el documento XML que se descompone. Una vezdescompuesto el documento, el valor de entrada suministrado al procedimiento almacenado seutiliza como valor sustituido para $DECOMP_DOCUMENTID.

$DECOMP_DOCUMENTID puede utilizarse para insertar identificadores exclusivos que no estánpresentes en el documento XML. Las aplicaciones pueden pasar ID de documento generados deforma exclusiva en XDBDECOMPXML. A continuación, estos ID pueden insertarse directamenteen una tabla de la base de datos. Los ID también pueden pasarse en expresiones que generanidentificadores exclusivos para elementos o atributos.

Tratamiento de las secciones CDATA en la descomposición delesquema XML anotadoSi los elementos que están anotados para la descomposición contienen secciones CDATA, el proceso dedescomposición inserta el contenido de las secciones CDATA en tablas, sin los delimitadores de secciónCDATA ("<![CDATA[" y "]]>").

Los pares de retorno de carro y salto de línea (U+000D y U+000A) o retornos de carro (U+000D) dentrode la sección CDATA se sustituyen por saltos de línea (U+000A).

Si la declaración del elemento XML en el esquema XML está anotada con el atributodb2-xdb:contentHandling="serializeSubtree", el contenido de la sección CDATA se inserta en las tablascon los siguientes cambios:v Se eliminan los delimitadores de sección CDATA ("<![CDATA[" y "]]>").v Cada carácter (&) de la sección CDATA se sustituye por la serie &amp:.v Cada corchete de apertura (<) de la sección CDATA se sustituye por la serie &lt:.

El contenido de la sección CDATA después de descomposición es lógicamente equivalente al contenidooriginal de la sección CDTATA.

Valores NULL y series vacías en la descomposición de esquemas XMLanotadosla descomposición de esquemas XML anotados inserta valores NULL o series vacías bajo ciertascondiciones.

Elementos XML

La tabla siguiente muestra cuándo se inserta una serie vacía o un valor NULL en la base de datos paralos elementos del documento XML.

Tabla 24. Manejo de NULL para los elementos correlacionados

Condición Serie vacía Valor NULL

Falta el elemento en el documento X

Programación SQL XML 107

Page 116: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 24. Manejo de NULL para los elementos correlacionados (continuación)

Condición Serie vacía Valor NULL

El elemento cumple todas las condiciones siguientes:

v está presente en el documento

v contiene el atributo xsi:nil="true" o xsi:nil="1" enla etiqueta de inicio

X

El elemento cumple todas las condiciones siguientes:

v está presente y vacío en el documento

v no contiene el atributo xsi:nil="true" o xsi:nil="1"de atributo en la etiqueta de inicio

v se deriva de o está declarado como de tipo de lista,tipo de unión, tipo complejo con contenido mixto olos siguientes tipos atómicos incorporados: xsd:string,xsd:normalizedString, xsd:token, xsd:hexBinary,xsd:base64Binary, xsd:anyURI, xsd:anySimpleType;cualquier otro tipo dará como resultado un error.

X

Nota:

1. Si una correlación implica las anotaciones db2-xdb:condition o db2-xdb:expression, la serie vacía o el valorNULL (como se muestra en esta tabla) se pasa como argumento para la evaluación de la expresión.

2. Si una columna de destino es de tipo CHAR o GRAPHIC, se inserta una serie vacía como una serie de caracteresen blanco.

Atributos XML

La tabla siguiente muestra cuándo se inserta una serie vacía o un valor NULL en la base de datos cuandolos atributos XML anotados para la descomposición contienen valores NULL en el documento o faltan enél.

Tabla 25. Manejo de NULL para los atributos correlacionados

Condición Serie vacía Valor NULL

Falta el atributo en el documento (ya sea porque no seha realizado ninguna validación, o ésta no habíasuministrado ningún valor predeterminado)

X

El atributo cumple todas las condiciones siguientes:

v está presente y vacío en el documento

v se deriva de o está declarado como de tipo de lista,tipo de unión o los siguientes tipos atómicosincorporados: xsd:string, xsd:normalizedString,xsd:token, xsd:hexBinary, xsd:base64Binary,xsd:anyURI, xsd:anySimpleType; cualquier otro tipodará como resultado un error.

X

Nota: Si una correlación implica las anotaciones db2-xdb:condition o db2-xdb:expression, la serie vacía o el valorNULL (como se muestra en esta tabla) se pasa como argumento para la evaluación de la expresión.

Lista de comprobación para la descomposición de esquemas XMLanotadosla descomposición de esquemas XML anotados puede llegar a ser compleja. Para hacer la tarea másmanejable, debe tomar en consideración varias cosas.

108 IBM i: Programación SQL XML

Page 117: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

La descomposición de esquemas XML anotados requiere correlacionar posiblemente varios elementos yatributos XML con varias columnas y tablas de la base de datos. Esta correlación también puede implicarla transformación de los datos XML antes de insertarlos o la aplicación de condiciones para la inserción.

Estos son aspectos a tener en cuenta al anotar el esquema XML, junto con punteros a documentaciónrelacionada:v Comprender qué anotaciones de descomposición están disponibles.v Durante la correlación, asegurare de que el tipo de la columna es compatible con el tipo de esquema

XML del elemento o atributo con el que se correlaciona.v Asegurarse de que los tipos complejos derivados por restricción o extensión están debidamente

anotados.v Confirmar que no se violan límites y restricciones de descomposición.v Asegurarse de que las tablas y las columnas referenciadas en la anotación existen en el momento de

registrar el esquema con el XSR.

Ejemplos de correlaciones en la descomposición de esquemas XMLanotadosLa descomposición de esquemas XML anotados se basa en correlaciones para determinar cómodescomponer un documento XML en tablas. Las correlaciones se expresan como anotaciones añadidas aldocumento de esquema XML. Estas correlaciones describen cómo debe descomponerse en tablas endocumento XML. Los ejemplos siguientes muestran algunos escenarios de correlación habituales.

Escenarios de correlación habituales:

Anotaciones de tipos complejos derivadosLos esquemas XML pueden contener tipos complejos derivados por restricción o extensión (especificadapor elementos complexType que incluyen elementos restriction o extension).

Al anotar esos tipos complejos para la descomposición, debe aplicar correlaciones adicionales.

Si se hace referencia a un tipo complejo en varios lugares de un esquema XML, puede correlacionarlo contablas y columnas diferentes en función de su ubicación en el esquema, utilizando la anotacióndb2-xdb:locationPath.

Los tipos complejos derivados por restricción requieren que los elementos y atributos comunes del tipobase se repitan en la definición del tipo derivado. Por tanto, las anotaciones de descomposición que estánpresentes en el tipo base también deben incluirse en el tipo derivado.

En la definición de los tipos complejos derivados por extensión, sólo se especifican los elementos yatributos adicionales con respecto al tipo base. Si las correlaciones de descomposición del tipo derivadodifieren de las correlaciones del tipo base, debe añadir anotaciones de descomposición al tipo base paradiferenciar claramente las correlaciones de los tipos base y derivado.

Ejemplo: en el documento de esquema XML siguiente, outOfPrintBookType se deriva por extensión. Secorrelaciona con una tabla distinta de la de su tipo base, que es bookType. La anotacióndb2-xdb:locationPath se especifica en el tipo base bookType para diferenciar claramente qué correlacionesse aplican al tipo de base, y cuáles al tipo derivado. Los elementos <lastPublished> y <publisher> deltipo derivado outOfPrintType no requieren la anotación db2-xdb:locationPath en este ejemplo, ya queestos elementos sólo están implicados en una única correlación.<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:db2-xdb="http://www.ibm.com/xmlns/prod/db2/xdb1"><xs:annotation>

<xs:appinfo><db2-xdb:table>

<db2-xdb:name>BOOKS</db2-xdb:name>

Programación SQL XML 109

Page 118: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<db2-xdb:rowSet>inPrintRowSet</db2-xdb:rowSet></db2-xdb:table><db2-xdb:table>

<db2-xdb:name>OUTOFPRINT</db2-xdb:name><db2-xdb:rowSet>outOfPrintRowSet</db2-xdb:rowSet>

</db2-xdb:table></xs:appinfo>

</xs:annotation><xs:element name="books">

<xs:complexType><xs:choice> Nota 1

<xs:element name="book" type="bookType"minOccurs="0" maxOccurs="unbounded"/>

<xs:element name="outOfPrintBook" type="outOfPrintBookType"minOccurs="0" maxOccurs="unbounded"/>

</xs:choice></xs:complexType>

</xs:element><xs:complexType name="bookType">

<xs:sequence><xs:element name="authorID" type="xs:integer"/><xs:element name="chapter" type="chapterType" maxOccurs="unbounded"/>

</xs:sequence><xs:attribute name="title" type="xs:string" Nota 2a

db2-xdb:locationPath="/books/book/@title"db2-xdb:rowSet="inPrintRowSet" db2-xdb:column="TITLE">

<xs:annotation><xs:appinfo><db2-xdb:rowSetMapping db2-xdb:locationPath="/books/outOfPrintBook/@title">

<db2-xdb:rowSet>outOfPrintRowSet</db2-xdb:rowSet><db2-xdb:column>TITLE</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo>

</xs:annotation></xs:attribute><xs:attribute name="isbn" type="xs:string" Nota 2b

db2-xdb:locationPath="/books/book/@isbn"db2-xdb:rowSet="inPrintRowSet" db2-xdb:column="ISBN">

<xs:annotation><xs:appinfo><db2-xdb:rowSetMapping db2-xdb:locationPath="/books/outOfPrintBook/@isbn">

<db2-xdb:rowSet>outOfPrintRowSet</db2-xdb:rowSet><db2-xdb:column>ISBN</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo>

</xs:annotation></xs:attribute>

</xs:complexType><xs:complexType name="outOfPrintBookType">

<xs:complexContent><xs:extension base="bookType">

<xs:sequence><xs:element name="lastPublished" type="xs:date" Nota 3

db2-xdb:rowSet="outOfPrintRowSet" db2-xdb:column="LASTPUBDATE"/><xs:element name="publisher" type="xs:string"

db2-xdb:rowSet="outOfPrintRowSet" db2-xdb:column="PUBLISHER"/></xs:sequence>

</xs:extension></xs:complexContent>

</xs:complexType><xs:simpleType name="paragraphType">

<xs:restriction base="xs:string"/></xs:simpleType><xs:complexType name="chapterType">

<xs:sequence><xs:element name="paragraph" type="paragraphType" maxOccurs="unbounded"

db2-xdb:locationPath="/books/book/chapter/paragraph"

110 IBM i: Programación SQL XML

Page 119: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

db2-xdb:rowSet="inPrintRowSet" db2-xdb:column="CONTENT"><xs:annotation>

<xs:appinfo><db2-xdb:rowSetMapping

db2-xdb:locationPath="/books/outOfPrintBook/chapter/paragraph"><db2-xdb:rowSet>outOfPrintBook</db2-xdb:rowSet><db2-xdb:column>CONTENT</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo>

</xs:annotation></xs:element>

</xs:sequence><xs:attribute name="number" type="xs:integer"/><xs:attribute name="title" type="xs:string"/>

</xs:complexType></xs:schema>

Las anotaciones indican que los valores del elemento <book> se descomponen en la tabla BOOKS, y losvalores del elemento <outOfPrintBook> se descompondrán en la tabla OUTOFPRINT.

Notas para el documento de esquema XML anotado:

1 Un documento <books> puede tener dos tipos de elementos: un elemento <book> o un elemento<outOfPrintBook>. La información de los dos tipos de elementos se descompone en tablasdiferentes. La definición del elemento <outOfPrintBook> tiene extensiones a la definición delelemento <book>.

2a y 2bEn el esquema XML, los atributos title e isbn tienen la misma definición para los elementos<book> o <outOfPrintBook> elementos, pero la información de libros en catálogo ydescatalogados va a tablas diferentes. Por lo tanto, necesita anotaciones db2-xdb:locationPath paradistinguir entre los títulos y números de ISBN de en catálogo y descatalogados.

3 Los elementos lastPublished y publisher son exclusivos de los elementos <outOfPrintBook>, porlo que no necesitan ninguna anotación db2-xdb:locationPath.

Supongamos que utiliza este documento de esquema XML para descomponer el documento XMLsiguiente:<books>

<book isbn="1-11-111111-1" title="Mi primer libro de XML"><authorID>22</authorID><chapter number="1" title="Introducción a XML">

<paragraph>XML es divertido...</paragraph></chapter><chapter number="2" title="XML y bases de datos">

<paragraph>XML puede utilizarse con...</paragraph></chapter>

</book><outOfPrintBook isbn="7-77-777777-7" title="Manual de introducción a XML">

<authorID>41</authorID><chapter number="1" title="Introducción a XML">

<paragraph>El Manual de introducción a XML...</paragraph></chapter><chapter number="2" title="Qué es XML">

<paragraph>XML es una tecnología emergente...</paragraph></chapter><lastPublished>2000-01-31</lastPublished><publisher>Early Publishers Group</publisher>

</outOfPrintBook></books>

La descomposición genera las tablas siguientes:

Programación SQL XML 111

Page 120: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 26. BOOKS

ISBN TITLE CONTENT

1-11-111111-1 Mi primer libro de XML XML es divertido...

1-11-111111-1 Mi primer libro de XML XML puede utilizarse con...

Tabla 27. OUTOFPRINT

ISBN TITLE CONTENT LASTPUBDATE PUBLISHER

7-77-777777-7 Manual deintroducción a XML

El manual deintroducción a XML...

2000-01-31 Early Publishers Group

7-77-777777-7 Manual deintroducción a XML

XML es una tecnologíaemergente...

2000-01-31 Early Publishers Group

Conjuntos de filas en la descomposición de esquemas XML anotados

La anotación db2-xdb:rowSet identifica la tabla y la fila de destino en las que se descompone un valor deun documento XML.

El valor de la anotación db2-xdb:rowSet puede ser un nombre de tabla o un nombre de conjunto de filas.

La anotación db2-xdb:rowSet puede ser un atributo de una declaración de elemento o atributo, o un hijode la anotación <db2-xdb:rowSetMapping>.

En un esquema XML, puede haber varias apariciones de un elemento o atributo, y todos esos elementoso atributos pueden tener una anotación db2-xdb:rowSet con el mismo valor de tabla de destino. Cada unade esas anotaciones db2-xdb:rowSet define una fila de la tabla de destino.

Ejemplo: supongamos que desea descomponer este documento para que el valor de isbn y de título decada libro se inserten en la tabla ALLPUBLICATIONS.<publications>

<textbook title="Programación con XML"><isbn>0-11-011111-0</isbn><author>Mary Brown</author><author>Alex Page</author><publicationDate>2002</publicationDate><university>University of London</university>

</textbook><childrensbook title="Fábulas infantiles">

<isbn>5-55-555555-5</isbn><author>Bob Carter</author><author>Melanie Snowe</author><publicationDate>1999</publicationDate>

</childrensbook></publications>

Debe definir los siguientes conjuntos de filas:v Un conjunto de filas para agrupar el valor de isbn para un libro de texto con su títulov Un conjunto de filas para agrupar el valor de isbn para un libro infantil con su título

El esquema XML anotado es el siguiente:<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:db2-xdb="http://www.ibm.com/xmlns/prod/db2/xdb1"elementFormDefault="qualified" attributeFormDefault="unqualified">

<xs:annotation><xs:appinfo>

<db2-xdb:defaultSQLSchema>admin</db2-xdb:defaultSQLSchema>

112 IBM i: Programación SQL XML

Page 121: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<db2-xdb:table><db2-xdb:name>ALLPUBLICATIONS</db2-xdb:name> Nota 1<db2-xdb:rowSet>textbk_rowSet</db2-xdb:rowSet><db2-xdb:rowSet>childrens_rowSet</db2-xdb:rowSet>

</db2-xdb:table></xs:appinfo>

</xs:annotation><xs:element name="publications">

<xs:complexType><xs:sequence>

<xs:element name="textbook" maxOccurs="unbounded"><xs:complexType>

<xs:sequence><xs:element name="isbn" type="xs:string" Nota 2a

db2-xdb:rowSet="textbk_rowSet" db2-xdb:column="PUBS_ISBN"/><xs:element name="author" type="xs:string" maxOccurs="unbounded"/><xs:element name="publicationDate" type="xs:gYear"/><xs:element name="university" type="xs:string"

maxOccurs="unbounded"/></xs:sequence><xs:attribute name="title" type="xs:string" use="required"Nota 2b

db2-xdb:rowSet="textbk_rowSet" db2-xdb:column="PUBS_TITLE"/></xs:complexType>

</xs:element><xs:element name="childrensbook" maxOccurs="unbounded">

<xs:complexType><xs:sequence>

<xs:element name="isbn" type="xs:string" Nota 3adb2-xdb:rowSet="childrens_rowSet" db2-xdb:column="PUBS_ISBN"/>

<xs:element name="author" type="xs:string" maxOccurs="unbounded"/><xs:element name="publicationDate" type="xs:gYear"/>

</xs:sequence><xs:attribute name="title" type="xs:string" use="required"Nota 3b

db2-xdb:rowSet="childrens_rowSet" db2-xdb:column="PUBS_TITLE"/></xs:complexType>

</xs:element></xs:sequence>

</xs:complexType></xs:element>

</xs:schema>

Notas para el documento de esquema XML anotado:

1 En el elemento <xs:annotation> global, el conjunto de filas textbk_rowSet y el conjunto de filaschildrens_rowSet están declarados para referencia futura en el esquema XML. La anotación<db2-xdb:name> indica la tabla (ALLPUBLICATIONS) a la que hacen referencia los conjuntos defilas.

2a y 2bLa anotación textbk_rowSet se especifica en la declaración del elemento isbn y la declaración delatributo title en el elemento <textbook>. Esto indica que la información de isbn y título de loselementos <textbook> se descompone en una fila de la tabla ALLPUBLICATIONS.

3a y 3bLa anotación childrens_rowSet se especifica en la declaración del elemento isbn y la declaracióndel atributo title en el elemento <childrensbook>. Esto indica que la información de isbn y títulode los elementos <childrensbook> se descompone en una fila de la tabla ALLPUBLICATIONS.

La tabla siguiente es el resultado de descomponer el documento mostrado anteriormente con el esquemaXML anotado:

Programación SQL XML 113

Page 122: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 28. ALLPUBLICATIONS

ISBN PUBS TITLE

0-11-011111-0 Programación con XML

5-55-555555-5 Fábulas infantiles

El ejemplo anterior muestra un caso sencillo de descomposición utilizando conjuntos de filas. Losconjuntos de filas pueden utilizarse en correlaciones más complejas para agrupar varios elementos dediferentes partes de un esquema XML para formar filas en el mismo par de tabla y columna.

Transformaciones condicionales

Los conjuntos de filas permiten aplicar transformaciones diferentes a los valores que se descomponen, enfunción de los propios valores.

Ejemplo: las dos instancias siguientes de un elemento denominado temperature tienen valores de atributodiferentes:<temperature unit="Celsius">49</temperature><temperature unit="Farenheit">49</temperature>

Si descompone estos valores en la misma tabla, deberá correlacionar todos los elementos con el atributounit="Celsius" con un conjunto de filas y todos los elementos con el atributo unit="Farenheit" con otroconjunto de filas. A continuación, puede aplicar una fórmula de conversión a los valores de un conjuntode filas de modo que todos los valores estén en las mismas unidades de temperatura antes de insertar losvalores en la tabla.

El siguiente esquema XML anotado muestra esta técnica.<db2-xdb:name>TEMPERATURE_DATA</db2-xdb:name>

<db2-xdb:rowSet>temp_celcius</db2-xdb:rowSet> Nota 1<db2-xdb:rowSet>temp_farenheit</db2-xdb:rowSet>

</db2-xdb:table>...

<xs:element name="temperature"><xs:annotation>

<xs:appinfo><db2-xdb:rowSetMapping>

<db2-xdb:rowSet>temp_celcius</db2-xdb:rowSet><db2-xdb:column>col1</db2-xdb:column>

</db2-xdb:rowSetMapping><db2-xdb:rowSetMapping>

<db2-xdb:rowSet>temp_farenheit</db2-xdb:rowSet><db2-xdb:column>col1</db2-xdb:column>

<db2-xdb:expression>CAST(myudf_convertToCelcius(CAST($DECOMP_CONTENT AS FLOAT)) AS FLOAT)</db2-xdb:expression> Nota 2

</db2-xdb:rowSetMapping></xs:appinfo>

</xs:annotation><xs:complexType>

<xs:simpleContent><xs:extension base="xs:string">

<xs:attribute name="unit" type="xs:string"><xs:annotation>

<xs:appinfo><db2-xdb:rowSetMapping> Nota 3

<db2-xdb:rowSet>temp_celcius</db2-xdb:rowSet><db2-xdb:condition>$DECOMP_CONTENT = ’Celsius’</db2-xdb:condition>

</db2-xdb:rowSetMapping><db2-xdb:rowSetMapping>

<db2-xdb:rowSet>temp_farenheit</db2-xdb:rowSet>

114 IBM i: Programación SQL XML

Page 123: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<db2-xdb:condition>$DECOMP_CONTENT = ’Farenheit’</db2-xdb:condition></db2-xdb:rowSetMapping>

</xs:appinfo></xs:annotation>

</xs:attribute></xs:extension>

</xs:simpleContent></xs:complexType>

</xs:element>

Notas para el documento de esquema XML anotado:

1 En el elemento <xs:annotation> global, el conjunto de filas temp_celcius y el conjunto de filastemp_farenheit están declarados para referencia futura en el esquema XML.

2 Una fórmula de conversión convierte los valores del conjunto de filas temp_farenheit a unidadesCelsius de modo que todos los valores estén en unidades Celsius cuando se inserten en una tabla.La anotación de expresión debe contener especificaciones CAST para convertir los argumentos yel tipo de retorno de la función a los tipos de datos SQL correspondiente con los que estádefinida la función.

3 Todos los elementos con el atributo unit="Celsius" están correlacionados con el conjunto de filastemp_celcius, y todos los elementos con el atributo unit="Farenheit" están correlacionados conel conjunto de filas temp_farenheit.

Ejemplo de anotación de descomposición: Correlación con una columna XMLEn la descomposición de esquemas XML anotados, puede correlacionar un fragmento de XML con unacolumna definida mediante el tipo de datos XML.

Considere el documento XML siguiente:<publications>

<textbook title="Programación con XML"><isbn>0-11-011111-0</isbn><author>Mary Brown</author><author>Alex Page</author><publicationDate>2002</publicationDate><university>University of London</university>

</textbook></publications>

Si deseara almacenar el elemento XML <textbook> y el título del libro como se indica a continuación,añadiría anotaciones a las declaraciones del elemento <textbook> y del atributo title en el documento deesquema XML correspondiente. Las anotaciones deben especificar las columnas DETAILS y TITLE, dondela columna DETAILS se ha definido con el tipo XML, así como la tabla TEXTBOOKS.

Tabla 29. TEXTBOOKS

TITLE DETAILS

Programación con XML <textbook title="Programación con XML"><isbn>0-11-011111-0</isbn><author>Mary Brown</author><author>Alex Page</author><publicationDate>2002</publicationDate><university>University of London</university>

</textbook>

En función de la anotación, ésta puede especificarse en el documento de esquema como atributo o comoelemento. Algunas anotaciones pueden especificarse como cualquiera de los dos. Consulte ladocumentación de cada anotación específica para determinar cómo puede especificarse una anotación enparticular.

Programación SQL XML 115

Page 124: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Especifique la tabla y columna de destino utilizando db2-xdb:rowSet y db2-xdb:column como atributosde <xs:element> o <xs:attribute> o los elementos hijo <db2-xdb:rowSet> y <db2-xdb:column> de<db2-xdb:rowSetMapping>. La especificación de estas correlaciones como elementos o atributos esequivalente.

El siguiente fragmento del documento de esquema XML muestra cómo se añaden dos correlaciones alelemento <textbook> y al atributo title especificando anotaciones como atributos.<xs:element name="publications">

<xs:complexType><xs:sequence>

<xs:element name="textbook" maxOccurs="unbounded"db2-xdb:rowSet="TEXTBOOKS" db2-xdb:column="DETAILS">

<xs:complexType><xs:sequence>

<xs:element name="isbn" type="xs:string"/><xs:element name="author" type="xs:string" maxOccurs="unbounded"/><xs:element name="publicationDate" type="xs:gYear"/><xs:element name="university" type="xs:string" maxOccurs="unbounded"/>

</xs:sequence><xs:attribute name="title" type="xs:string" use="required"

db2-xdb:rowSet="TEXTBOOKS" db2-xdb:column="TITLE"/></xs:complexType>

</xs:element></xs:sequence>

</xs:complexType></xs:element>

Las anotaciones db2-xdb:rowSet especifican el nombre de la tabla de destino, y las anotacionesdb2-xdb:column especifican el nombre de la columna de destino. Puesto que el elemento <textbook> esde tipo complejo e incluye contenido complejo, y la anotación db2-xdb:contentHandling no se haespecificado, de forma predeterminada, todo el código dentro del elemento (incluidos los códigos inicial yfinal) se inserta en la columna XML de acuerdo con el valor serializeSubtree de db2-xdb:contentHandling.El espacio en blanco dentro del documento XML se conserva. Consulte la documentación dedb2-xdb:contentHandling para obtener más información.

Ejemplo de anotación de descomposición: Un valor correlacionado con una solatabla que genera una sola filaCorrelacionar un valor de un documento XML con un único par de tabla y columna es una forma simplede correlación en la descomposición de esquemas XML anotados. Este ejemplo muestra el caso simple derelación uno a uno entre los valores de un conjunto de filas.

El resultado de esta correlación depende de la relación entre los elementos correlacionados con el mismoconjunto de filas. Si los valores correlacionados en un único conjunto de filas tienen una relación de unoa uno, según lo determinado por el valor del atributo maxOccurs del elemento o la declaración del grupode modelos que lo contiene, se formará una sola fila para cada instancia del elemento correlacionado enel documento XML. Si los valores de un único conjunto de filas tienen una relación de uno a muchos,donde un valor aparece sólo una vez en el documento para varias instancias de otro elemento, según loindicado por el valor del atributo maxOccurs, se generarán varias filas al descomponer el documentoXML.

Considere el documento XML siguiente:<publications>

<textbook title="Programación con XML"><isbn>0-11-011111-0</isbn><author>Mary Brown</author><author>Alex Page</author><publicationDate>2002</publicationDate><university>University of London</university>

</textbook></publications>

116 IBM i: Programación SQL XML

Page 125: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Si desea que los valores de los elementos <isbn> y <publicationDate>, así como el atributo title, sedescompongan en la tabla TEXTBOOKS como se indica a continuación, debe añadir anotaciones a lasdeclaraciones de estos elementos y atributos en el documento de esquema XML correspondiente. Lasanotaciones especificarán los nombres de tabla y de columna con las que cada elemento estácorrelacionado.

Tabla 30. TEXTBOOKS

ISBN TITLE DATE

0-11-011111-0 Programación con XML 2002

Para correlacionar un valor con un solo par de tabla y columna, debe especificar la tabla y la columna enel valor que desea correlacionar. Realice esta operación mediante uno de los siguientes conjuntos deanotaciones:v db2-xdb:rowSet y db2-xdb:column como atributos de <xs:element> o <xs:attribute>v <db2-xdb:rowSet> y <db2-xdb:column> como elementos hijo de <db2-xdb:rowSetMapping>

El siguiente esquema XML anotado especifica las anotaciones db2-xdb:rowSet y db2-xdb:column comoatributos.<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:db2-xdb="http://www.ibm.com/xmlns/prod/db2/xdb1">

<xs:annotation><xs:appinfo><db2-xdb:defaultSQLSchema>"MYSCHEMA"</db2-xdb:defaultSQLSchema></xs:appinfo></xs:annotation>

<xs:element name="publications"><xs:complexType>

<xs:sequence><xs:element name="textbook" maxOccurs="unbounded">

<xs:complexType><xs:sequence>

<xs:element name="isbn" type="xs:string" maxOccurs="1"db2-xdb:rowSet="TEXTBOOKS"db2-xdb:column="ISBN"/>

<xs:element name="author" type="xs:string" maxOccurs="unbounded"/><xs:element name="publicationDate" type="xs:gYear" maxOccurs="1"

db2-xdb:rowSet="TEXTBOOKS"db2-xdb:column="DATE"/>

<xs:element name="university" type="xs:string" maxOccurs="unbounded"/></xs:sequence><xs:attribute name="title" type="xs:string" use="required"

db2-xdb:rowSet="TEXTBOOKS"db2-xdb:column="TITLE"/>

</xs:complexType></xs:element></xs:sequence>

</xs:complexType></xs:element></xs:schema>

El atributo maxOccurs para los elementos destinados al conjunto de filas es 1, por lo que los elementosque se correlacionan con la tabla TEXTBOOKS tienen una relación de uno a uno entre sí. Por tanto, seforma una sola fila para cada instancia del elemento <textbook>.

Programación SQL XML 117

Page 126: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo de anotación de descomposición: Un valor correlacionado con una solatabla que genera varias filasCorrelacionar un valor de un documento XML con un único par de tabla y columna es una forma simplede correlación en la descomposición de esquemas XML anotados. Este ejemplo muestra el caso máscomplejo de una relación uno a muchos entre valores de un conjunto de filas.

El resultado de esta correlación depende de la relación entre los elementos correlacionados con el mismoconjunto de filas. Si los valores correlacionados en un único conjunto de filas tienen una relación de unoa uno, según lo determinado por el valor del atributo maxOccurs del elemento o la declaración del grupode modelos que lo contiene, se formará una sola fila para cada instancia del elemento correlacionado enel documento XML. Si los valores de un único conjunto de filas tienen una relación de uno a muchos,donde un valor aparece sólo una vez en el documento para varias instancias de otro elemento, según loindicado por el valor del atributo maxOccurs, se generarán varias filas al descomponer el documentoXML.

Considere el documento XML siguiente:<textbook title="Programación con XML">

<isbn>0-11-011111-0</isbn><author>Mary Brown</author><author>Alex Page</author><publicationDate>2002</publicationDate><university>University of London</university>

</textbook>

Si deseara almacenar el ISBN y los autores de un libro de texto como se indica a continuación, añadiríaanotaciones a las declaraciones de los elementos <isbn> y <author> en el documento de esquema XMLcorrespondiente. Las anotaciones deben especificar las columnas ISBN y AUTHNAME, así como la tablaTEXTBOOK_AUTH.

Tabla 31. TEXTBOOKS_AUTH

ISBN AUTHNAME

0-11-011111-0 Mary Brown

0-11-011111-0 Alex Page

En función de la anotación, ésta puede especificarse en el documento de esquema como atributo o comoelemento. Algunas anotaciones pueden especificarse como cualquiera de los dos. Consulte ladocumentación de cada anotación específica para determinar cómo puede especificarse una anotación enparticular.

Para correlacionar un valor con un solo par de tabla y columna, debe especificar la tabla y la columna enel valor que desea correlacionar. Realice esta operación mediante uno de los siguientes conjuntos deanotaciones:v db2-xdb:rowSet y db2-xdb:column como atributos de <xs:element> o <xs:attribute>v <db2-xdb:rowSet> y <db2-xdb:column> como elementos hijo de <db2-xdb:rowSetMapping>

El siguiente esquema XML anotado especifica las anotaciones <db2-xdb:rowSet> y <db2-xdb:column>como elementos.<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:db2-xdb="http://www.ibm.com/xmlns/prod/db2/xdb1">

<xs:annotation><xs:appinfo><db2-xdb:defaultSQLSchema>"MYSCHEMA"</db2-xdb:defaultSQLSchema></xs:appinfo></xs:annotation>

118 IBM i: Programación SQL XML

Page 127: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<xs:element name="textbook"><xs:complexType>

<xs:sequence maxOccurs="unbounded">

<xs:element name="isbn" type="xs:string"><xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>TEXTBOOKS_AUTH</db2-xdb:rowSet><db2-xdb:column>ISBN</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo></xs:annotation>

</xs:element>

<xs:element name="author" type="xs:string" maxOccurs="unbounded"><xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>TEXTBOOKS_AUTH</db2-xdb:rowSet><db2-xdb:column>AUTHNAME</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo></xs:annotation>

</xs:element>

<xs:element name="publicationDate" type="xs:gYear"/>

<xs:element name="university" type="xs:string" maxOccurs="unbounded"/>

</xs:sequence><xs:attribute name="title" type="xs:string" use="required"/></xs:complexType>

</xs:element></xs:schema>

Observe que el elemento <isbn> sólo se correlaciona una vez con la columna ISBN, aunque aparece endos filas de la tabla. Esto sucede automáticamente durante el proceso de descomposición porque hayvarios autores por cada valor ISBN. El valor de <isbn> se duplica en cada fila para cada autor.

Este comportamiento se produce porque se detecta una relación de uno a muchos entre los elementos<isbn> y <author>, ya que el atributo de <author> maxOccurs es superior a 1.

Tenga en cuenta que una relación de uno a muchos puede implicar más de dos elementos e incluirconjuntos de elementos. La relación de uno a muchos también puede estar profundamente anidada,donde un elemento ya implicado en una relación de uno a muchos puede participar en una relación deuno a muchos.

Ejemplo de anotación de descomposición: Un valor correlacionado con variastablasUn valor único de un documento XML puede correlacionarse con varias tablas. Este ejemplo muestracómo anotar un documento de esquema XML para correlacionar un valor único con dos tablas.

Considere el documento XML siguiente.<textbook title="Programación con XML">

<isbn>0-11-011111-0</isbn><author>Mary Brown</author><author>Alex Page</author><publicationDate>2002</publicationDate><university>University of London</university>

</textbook>

Programación SQL XML 119

Page 128: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Para correlacionar el ISBN de un libro de texto con las dos tablas siguientes, debe crear dos correlacionesen el elemento <isbn>. Esto puede hacerse añadiendo varios elementos <db2-xdb:rowSetMapping> a ladeclaración del elemento <isbn> en el documento de esquema XML.

Tabla 32. TEXTBOOKS

ISBN TITLE

0-11-011111-0 Programación con XML

Tabla 33. SCHOOLPUBS

ISBN SCHOOL

0-11-011111-0 University of London

El siguiente fragmento del documento de esquema XML muestra cómo se añaden dos correlaciones a ladeclaración del elemento <isbn> para especificar las correlaciones con dos tablas. El valor del atributotitle y el elemento <university> también se incluyen en las correlaciones.<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:db2-xdb="http://www.ibm.com/xmlns/prod/db2/xdb1">

<xs:annotation><xs:appinfo><db2-xdb:defaultSQLSchema>"MYSCHEMA"</db2-xdb:defaultSQLSchema></xs:appinfo></xs:annotation>

<xs:element name="textbook"><xs:complexType>

<xs:sequence maxOccurs="unbounded">

<xs:element name="isbn" type="xs:string"><xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>TEXTBOOKS</db2-xdb:rowSet><db2-xdb:column>ISBN</db2-xdb:column>

</db2-xdb:rowSetMapping><db2-xdb:rowSetMapping>

<db2-xdb:rowSet>SCHOOLPUBS</db2-xdb:rowSet><db2-xdb:column>ISBN</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo></xs:annotation>

</xs:element>

<xs:element name="author" type="xs:string" maxOccurs="unbounded"/>

<xs:element name="publicationDate" type="xs:gYear"/>

<xs:element name="university" type="xs:string" maxOccurs="unbounded"><xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>SCHOOLPUBS</db2-xdb:rowSet><db2-xdb:column>SCHOOL</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo></xs:annotation>

</xs:element>

</xs:sequence><xs:attribute name="title" type="xs:string" use="required">

120 IBM i: Programación SQL XML

Page 129: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>TEXTBOOKS</db2-xdb:rowSet><db2-xdb:column>TITLE</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo>

</xs:annotation></xs:attribute>

</xs:complexType></xs:element>

Ejemplo de anotación de descomposición: Agrupación de varios valorescorrelacionados con una sola tablaEn la descomposición de esquemas XML anotados, puede correlacionar varios valores de elementos norelacionados con la misma tabla, conservando la relación entre valores lógicamente relacionados. Esto esposible declarando varios conjuntos de filas, que se utilizan para agrupar elementos relacionados paraformar una fila, tal como se muestra en este ejemplo.

Por ejemplo, considere el documento XML siguiente:<publications>

<textbook title="Programación con XML"><isbn>0-11-011111-0</isbn><author>Mary Brown</author><author>Alex Page</author><publicationDate>2002</publicationDate><university>University of London</university>

</textbook><childrensbook title="Fábulas infantiles">

<isbn>5-55-555555-5</isbn><author>Bob Carter</author><author>Melaine Snowe</author><publicationDate>1999</publicationDate>

</childrensbook></publications>

Para generar la tabla siguiente después de la descomposición, debe asegurarse de que los valoresrelacionados con un libro de texto no están agrupados en la misma fila que los valores asociados con unlibro infantil. Utilice varios conjuntos de filas para agrupar valores relacionados y generar filaslógicamente significativas.

Tabla 34. ALLPUBLICATIONS

PUBS_ISBN PUBS_TITLE

0-11-011111-0 Programación con XML

5-55-555555-5 Fábulas infantiles

En un caso de correlación simple, donde se correlaciona un solo valor con un único par de tabla ycolumna, podría especificar simplemente la tabla y la columna con las que desea correlacionar el valor.

Sin embargo, este ejemplo muestra un caso más complejo, en el que varios valores se correlacionan con lamisma tabla y deben agruparse lógicamente. Si simplemente correlacionara cada ISBN y título con lascolumnas PUBS_ISBN y PUBS_TITLE, sin el uso de rowSets, el proceso de descomposición no podríadeterminar qué valor ISBN pertenece a cada valor de título. Mediante el uso de rowSets, puede agruparvalores relacionados lógicamente para formar una fila significativa.

El documento de esquema XML siguiente muestra cómo se definen dos rowSets para distinguir losvalores del elemento <textbook> de los valores del elemento <childrensbook>.

Programación SQL XML 121

Page 130: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:db2-xdb="http://www.ibm.com/xmlns/prod/db2/xdb1">

<xs:annotation><xs:appinfo>

<db2-xdb:defaultSQLSchema>"MYSCHEMA"</db2-xdb:defaultSQLSchema><db2-xdb:table>

<db2-xdb:name>ALLPUBLICATIONS</db2-xdb:name><db2-xdb:rowSet>testbk_rowSet</db2-xdb:rowSet><db2-xdb:rowSet>childrens_rowSet</db2-xdb:rowSet>

</db2-xdb:table></xs:appinfo></xs:annotation>

<xs:element name="publications"><xs:complexType>

<xs:sequence maxOccurs="unbounded">

<xs:element name="textbook"><xs:complexType>

<xs:sequence maxOccurs="unbounded"><xs:element name="isbn" type="xs:string"

db2-xdb:rowSet="testbk_rowSet"db2-xdb:column="PUBS_ISBN"/>

<xs:element name="author" type="xs:string" maxOccurs="unbounded"/><xs:element name="publicationDate" type="xs:gYear"/><xs:element name="university" type="xs:string" maxOccurs="unbounded"/>

</xs:sequence><xs:attribute name="title" type="xs:string" use="required"

db2-xdb:rowSet="testbk_rowSet"db2-xdb:column="PUBS_TITLE"/>

</xs:complexType></xs:element>

<xs:element name="childrensbook"><xs:complexType>

<xs:sequence maxOccurs="unbounded"><xs:element name="isbn" type="xs:string"

db2-xdb:rowSet="childrens_rowSet"db2-xdb:column="PUBS_ISBN"/>

<xs:element name="author" type="xs:string" maxOccurs="unbounded"/><xs:element name="publicationDate" type="xs:gYear"/>

</xs:sequence><xs:attribute name="title" type="xs:string" use="required"

db2-xdb:rowSet="childrens_rowSet"db2-xdb:column="PUBS_TITLE"/>

</xs:complexType></xs:element>

</xs:sequence></xs:complexType>

</xs:element></xs:schema>

Observe cómo las correlaciones de db2-xdb:rowSet de cada una de las declaraciones de elemento yatributo no especifican el nombre de una tabla, sino el nombre de un rowSet. Los rowSets están asociadoscon la tabla ALLPUBLICATIONS en la anotación <db2-xdb:table>, que debe especificarse como hijo de<xs:schema>.

Al especificar varios rowSets que se correlacionan con la misma tabla, puede asegurarse de que losvalores relacionados lógicamente forman una fila de la tabla.

122 IBM i: Programación SQL XML

Page 131: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo de anotación de descomposición: Varios valores de contextos diferentescorrelacionados con una sola tablaEn la descomposición de esquemas XML anotados, puede correlacionar varios valores con la misma tablay columna, de modo que una sola columna puede contener valores que provienen de diferentes partes deun documento. Esto puede hacerse declarando varios rowSets, como se muestra en este ejemplo.

Por ejemplo, considere el documento XML siguiente:<publications>

<textbook title="Principios de matemáticas"><isbn>1-11-111111-1</isbn><author>Alice Braun</author><publisher>Math Pubs</publisher><publicationDate>2002</publicationDate><university>University of London</university>

</textbook></publications>

Puede correlacionar el autor y el editor con la misma tabla que contiene los contactos para un libro enparticular.

Tabla 35. BOOKCONTACTS

ISBN CONTACT

1-11-111111-1 Alice Braun

1-11-111111-1 Math Pubs

Los valores de la columna CONTACT de la tabla resultante proceden de diferentes partes del documentoXML: una fila puede contener un nombre de autor (del elemento <author>), mientras que otra filacontiene el nombre de un editor (del elemento <publisher>).

El siguiente esquema XML muestra cómo pueden utilizarse varios rowSets para generar esta tabla:<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:db2-xdb="http://www.ibm.com/xmlns/prod/db2/xdb1">

<xs:annotation><xs:appinfo>

<db2-xdb:defaultSQLSchema>"MYSCHEMA"</db2-xdb:defaultSQLSchema><db2-xdb:table>

<db2-xdb:name>BOOKCONTACTS</db2-xdb:name><db2-xdb:rowSet>author_rowSet</db2-xdb:rowSet><db2-xdb:rowSet>publisher_rowSet</db2-xdb:rowSet>

</db2-xdb:table></xs:appinfo></xs:annotation>

<xs:element name="publications"><xs:complexType>

<xs:sequence maxOccurs="unbounded">

<xs:element name="textbook" maxOccurs="unbounded"><xs:complexType>

<xs:sequence>

<xs:element name="isbn" type="xs:string"><xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>author_rowSet</db2-xdb:rowSet><db2-xdb:column>ISBN</db2-xdb:column>

</db2-xdb:rowSetMapping>

Programación SQL XML 123

Page 132: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<db2-xdb:rowSetMapping><db2-xdb:rowSet>publisher_rowSet</db2-xdb:rowSet><db2-xdb:column>ISBN</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo></xs:annotation>

</xs:element>

<xs:element name="author" type="xs:string" maxOccurs="unbounded"><xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>author_rowSet</db2-xdb:rowSet><db2-xdb:column>CONTACT</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo></xs:annotation>

</xs:element>

<xs:element name="publisher" type="xs:string"><xs:annotation><xs:appinfo>

<db2-xdb:rowSetMapping><db2-xdb:rowSet>publisher_rowSet</db2-xdb:rowSet><db2-xdb:column>CONTACT</db2-xdb:column>

</db2-xdb:rowSetMapping></xs:appinfo></xs:annotation>

</xs:element>

<xs:element name="publicationDate" type="xs:gYear"/><xs:element name="university"

type="xs:string" maxOccurs="unbounded"/></xs:sequence><xs:attribute name="title" type="xs:string" use="required"/>

</xs:complexType></xs:element>

</xs:sequence></xs:complexType>

</xs:element></xs:schema>

Observe cómo las correlaciones de db2-xdb:rowSet en cada una de las declaraciones de elemento noespecifican el nombre de una tabla, sino el nombre de un rowSet. Los rowSets están asociados con latabla BOOKCONTACTS en la anotación <db2-xdb:table>, que debe especificarse como hijo de<xs:schema>.

Compatibilidad de tipos de esquema XML con tipos SQL para la descomposiciónde esquemas anotadosLa descomposición de esquemas XML anotados da soporte a la descomposición de valores XML encolumnas que sean de un tipo SQL compatible.

Las tablas siguientes muestran los tipos de datos de esquema XML y los tipos de datos de carácter,gráficos y de fecha de SQL compatibles para la descomposición de esquemas XML.

124 IBM i: Programación SQL XML

Page 133: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 36. Tipos de datos compatibles de esquema XML y SQL

Tipo de esquema XML

Tipo SQL

CHAR

VARCHAR

DATE

TI

ME

TI

MESTAMP

string, normalizedString, token 1a* 1a 7 8 9

base64Binary, 2* 2 No No No

hexBinary 2* 2 No No No

byte, unsigned byte 3* 3 No No No

integer, positiveInteger, negativeInteger, nonNegativeInteger,nonPositiveInteger

3* 3 No No No

int, unsignedInt 3* 3 No No No

long, unsignedLong 3* 3 No No No

short, unsignedShort 3* 3 No No No

decimal 3* 3 No No No

float 3* 3 No No No

double 3* 3 No No No

boolean 3* 3 No No No

time 4* 4 No 10 No

dateTime 4* 4 11 12 13

duration, gMonth, gYear, gDay, gMonthDay, gYearMonth 4* 4 No No No

date 4* 4 14 No No

Name, NCName, NOTATION, ID, IDREF, QName,NMTOKEN, ENTITY

1a* 1a No No No

ENTITIES, NMTOKENS, IDREFS, tipos de lista 1b* 1b No No No

anyURI 6* 6 No No No

language 1a* 1a No No No

anySimpleType, tipos de unión 5* 5 No No No

Notas* Si la longitud de la serie XML de entrada es inferior a la longitud definida de la columna de

destino, la serie se rellena con blancos por la derecha cuando se inserta.

No Los tipos de datos no son compatibles para la descomposición de esquemas XML anotados.

1a Compatible si la longitud de la serie de entrada XML, en caracteres, es menor o igual que lalongitud de la columna de destino en caracteres. Si la serie de entrada es más larga que lacolumna de destino, la serie de caracteres sólo es compatible si db2-xdb:truncate se establece en"true" o "1" para esta correlación de columnas. La longitud de la serie se calcula después de lanormalización, donde la serie de entrada se normaliza de acuerdo con la faceta whitespace deltipo de esquema XML.

1b Compatible según las condiciones descritas en 1a. El valor que se inserta en la columna dedestino es la serie de elementos de la lista concatenados, cada uno separado por un único espacio(en conformidad con la faceta whitespace con el valor "collapse" para las listas).

2 Compatible si la longitud de la serie de entrada XML, en caracteres, es menor o igual que lalongitud de la columna de destino en caracteres. Si la serie de entrada es más larga que lacolumna de destino, la serie de caracteres sólo es compatible si db2-xdb:truncate se establece en"true" o "1" para esta correlación de columnas. La serie de entrada se normaliza de acuerdo con lafaceta whitespace del tipo de esquema XML. Se inserta la serie codificada (original).

3 Compatible si la longitud de la serie de entrada XML, calculada después del proceso según elvalor db2-xdb:normalization, es menor o igual que la longitud de la columna de destino. Tambiéncompatible si db2-xdb:truncate se establece en "true" o "1" para esta correlación de columnas.

Programación SQL XML 125

Page 134: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

4 Compatible si el número de caracteres en la representación de serie del valor de entrada XML,calculada después del proceso según el valor db2-xdb:normalization, es menor o igual que lalongitud de la columna de destino en caracteres. También compatible si db2-xdb:truncate seestablece en "true" o "1" para esta correlación de columnas.

5 Compatible si la longitud de la serie de entrada XML, en caracteres, es menor o igual que lalongitud de la columna de destino en caracteres. Si la serie de entrada es más larga que lacolumna de destino, la serie de caracteres sólo es compatible si db2-xdb:truncate se establece en"true" o "1" para esta correlación de columnas. El valor que se inserta en la columna de destino encualquiera de los casos es el contenido de caracteres del elemento o atributo.

6 Compatible si la longitud de la serie de URI, en caracteres, es menor o igual que la longitud de lacolumna de destino en caracteres. Si la serie de entrada es más larga que la columna de destino,la serie de caracteres sólo es compatible si db2-xdb:truncate se establece en "true" o "1" para estacorrelación de columnas. Tenga en cuenta que se inserta el URI propiamente dicho, no el recursoal que apunta el URI.

7 Compatible si la serie tiene un formato de fecha válido: aaaa-mm-dd, mm/dd/aaaa o dd.mm.aaaa.

8 Compatible si la serie tiene un formato de hora válido: hh.mm.ss, hh:mm AM o PM o hh:mm:ss.

9 Compatible si la serie tiene un formato de indicación de fecha y hora válido:aaaa-mm-dd-hh.mm.ss.nnnnnn.

10 Para los valores XML que contienen subsegundos, compatible sólo si la anotación dedescomposición especifica db2-xdb:truncate como "true" o "1". Para los valores XML conindicadores de huso horario y db2-xdb:truncate establecido en "true" o "1", se insertan indicadoresde huso horario sin el huso horario.

11 Compatible si el año se compone de cuatro dígitos y no va precedido del signo '-'.

12 Compatible si el valor XML no tiene indicador de huso horario. Si el valor XML tiene indicadorde huso horario, los valores son compatibles si db2-xdb:truncate está establecido en "true" o "1".

13 Compatible si el año se compone de cuatro dígitos y no va precedido del signo '-'. Para losvalores XML con indicadores de huso horario, compatible si db2-xdb:truncate está establecido en"true" o "1". Si los subsegundos se especifican con más de seis dígitos, compatible sidb2-xdb:truncate se establece en "true" o "1".

14 Compatible si el año se compone de cuatro dígitos y no va precedido del signo '-'. Para losvalores XML con indicadores de huso horario, compatible si db2-xdb:truncate está establecido en"true" o "1". (En este caso, los valores de fecha se insertan sin el huso horario.)

Tabla 37. Tipos de datos compatibles de esquema XML y SQL

Tipo de esquema XML

Tipo SQL

GRAPHIC

VARGRAPHIC

CLOB

DBCLOB

string, normalizedString, token 1a* 1a 1a 1a*

base64Binary, No No 3 No

hexBinary No No 3 No

byte, unsigned byte No No 4 No

integer, positiveInteger, negativeInteger, nonNegativeInteger,nonPositiveInteger

No No 4 No

int, unsignedInt No No 4 No

long, unsignedLong No No 4 No

short, unsignedShort No No 4 No

126 IBM i: Programación SQL XML

Page 135: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 37. Tipos de datos compatibles de esquema XML y SQL (continuación)

Tipo de esquema XML

Tipo SQL

GRAPHIC

VARGRAPHIC

CLOB

DBCLOB

decimal No No 4 No

float No No 4 No

double No No 4 No

boolean No No 4 No

time No No 5 No

dateTime No No 5 No

duration, gMonth, gYear, gDay, gMonthDay, gYearMonth No No 5 No

date No No 5 No

Name, NCName, NOTATION, ID, IDREF, QName, NMTOKEN,ENTITY

1a* 1a 1a 1a*

ENTITIES, NMTOKENS, IDREFS, tipos de lista 1b* 1b 1b 1b*

anyURI No No 6 No

language No No 1a No

anySimpleType, tipos de unión 2a* 2a 2a 2a*

Notas* Si la longitud de la serie XML de entrada es inferior a la longitud definida de la columna de

destino, la serie se rellena con blancos por la derecha cuando se inserta.

No Los tipos de datos no son compatibles para la descomposición de esquemas XML anotados.

1a Compatible si la longitud de la serie de entrada XML, en caracteres de doble byte, es menor oigual que la longitud de la columna de destino en caracteres. Si la serie de entrada es más largaque la columna de destino, la serie de caracteres sólo es compatible si db2-xdb:truncate seestablece en "true" o "1" para esta correlación de columnas. La longitud de la serie se calculadespués de la normalización, donde la serie de entrada se normaliza de acuerdo con la facetawhitespace del tipo de esquema XML.

1b Compatible según las condiciones descritas en 1a. El valor que se inserta en la columna dedestino es la serie de elementos de la lista concatenados, cada uno separado por un único espacio(en conformidad con la faceta whitespace con el valor "collapse" para las listas).

2a Compatible si la longitud de la serie de entrada XML, en caracteres, es menor o igual que lalongitud de la columna de destino en caracteres. Si la serie de entrada es más larga que lacolumna de destino, la serie de caracteres sólo es compatible si db2-xdb:truncate se establece en"true" o "1" para esta correlación de columnas. El valor que se inserta en el destino en cualquierade los casos es el contenido de caracteres del elemento o atributo.

3 Compatible si la longitud de la serie de entrada XML, en caracteres, es menor o igual que lalongitud de la columna de destino en caracteres. Si la serie de entrada es más larga que lacolumna de destino, la serie de caracteres sólo es compatible si db2-xdb:truncate se establece en"true" o "1" para esta correlación de columnas. La serie de entrada se normaliza de acuerdo con lafaceta whitespace del tipo de esquema XML. Se inserta la serie codificada (original).

4 Compatible si la longitud de la serie XML, calculada después del proceso según el valordb2-xdb:normalization, es menor o igual que la longitud de la columna de destino en caracteres.También compatible si db2-xdb:truncate se establece en "true" o "1" para esta correlación decolumnas.

5 Compatible si el número de caracteres en la representación de serie del valor de entrada XML,

Programación SQL XML 127

Page 136: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

calculada después del proceso según el valor db2-xdb:normalization, es menor o igual que lalongitud de la columna de destino en caracteres. También compatible si db2-xdb:truncate seestablece en "true" o "1" para esta correlación de columnas.

6 Compatible si la longitud de la serie de URI, en caracteres, es menor o igual que la longitud de lacolumna de destino en caracteres. Si la serie de entrada es más larga que la columna de destino,la serie de caracteres sólo es compatible si db2-xdb:truncate se establece en "true" o "1" para estacorrelación de columnas. Tenga en cuenta que se inserta el URI propiamente dicho, no el recursoal que apunta el URI.

La tabla siguiente indica los tipos de datos de esquema XML y los tipos de datos binarios de SQLcompatibles para la descomposición de esquemas XML.

Tabla 38. Tipos de datos compatibles de esquema XML y SQL

Tipo de esquema XML

Tipo SQL

BINARY

VARBINARY

BLOB

string, normalizedString, token 1a* 1a 1a

base64Binary, 1a 1a 1a

hexBinary 2* 2 2

byte, unsigned byte No No No

integer, positiveInteger, negativeInteger, nonNegativeInteger, nonPositiveInteger No No No

int, unsignedInt No No No

long, unsignedLong No No No

short, unsignedShort No No No

decimal No No No

float No No No

double No No No

boolean No No No

time No No No

dateTime No No No

duration, gMonth, gYear, gDay, gMonthDay, gYearMonth No No No

date No No No

Name, NCName, NOTATION, ID, IDREF, QName, NMTOKEN, ENTITY 1a* 1a 1a

ENTITIES, NMTOKENS, IDREFS, tipos de lista 1b* 1b 1b

anyURI 1a 1a 1a

language 1a* 1a 1a

anySimpleType, tipos de unión 3* 3 3

Notas* Si la longitud de la serie XML de entrada es inferior a la longitud definida de la columna de

destino, la serie se rellena con blancos por la derecha cuando se inserta.

No Los tipos de datos no son compatibles para la descomposición de esquemas XML anotados.

1a Compatible si la longitud de la serie de entrada XML, en caracteres, es menor o igual que lalongitud de la columna de destino en caracteres. Si la serie de entrada es más larga que lacolumna de destino, la serie de caracteres sólo es compatible si db2-xdb:truncate se establece en"true" o "1" para esta correlación de columnas. El valor que se inserta en el destino en cualquierade los casos es el contenido de caracteres del elemento o atributo.

1b Compatible según las condiciones descritas en 1a. El valor que se inserta en la columna dedestino es la serie de elementos de la lista concatenados, cada uno separado por un único espacio(en conformidad con la faceta whitespace con el valor "collapse" para las listas).

128 IBM i: Programación SQL XML

Page 137: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

2 Compatible si la longitud de la serie de entrada XML, en bytes, es menor o igual que la longitudde la columna de destino en bytes. Si la serie de entrada es más larga que la columna de destino,la serie de caracteres sólo es compatible si db2-xdb:truncate se establece en "true" o "1" para estacorrelación de columnas. La longitud de la serie se calcula después de la normalización, donde laserie de entrada se normaliza de acuerdo con la faceta whitespace del tipo de esquema XML. Seinserta la serie codificada (original).

3 Compatible si la longitud de la serie de entrada XML, en bytes, es menor o igual que la longitudde la columna de destino en bytes. Si la serie de entrada es más larga que la columna de destino,la serie de caracteres sólo es compatible si db2-xdb:truncate se establece en "true" o "1" para estacorrelación de columnas. El valor que se inserta en la columna de destino en cualquiera de loscasos es el contenido de caracteres del elemento o atributo.

Las tablas siguientes indican los tipos de datos de esquema XML y los tipos de datos numéricos de SQLcompatibles para la descomposición de esquemas XML.

Tabla 39. Tipos de datos compatibles de esquema XML y SQL

Tipo de esquema XML

Tipo SQL

SMALLINT

INTEGER

BIGINT

REAL

DOUBLE

DECFLOAT

string, normalizedString, token 1 1 1 1 1 1

base64Binary, No No No No No No

hexBinary No No No No No No

byte, unsigned byte 2 2 2 2 2 2

integer, positiveInteger, negativeInteger,nonNegativeInteger, nonPositiveInteger

3 3 3 4 4 3

int, unsignedInt 3 2 2 4 2 2

long, unsignedLong 3 3 2 4 2 2

short, unsignedShort 2 2 2 2 2 2

decimal 4 4 4 4 4 4

float 5 5 5 6 6 6

double 5 5 5 5 6 6

boolean 7 7 7 7 7 7

time No No No No No No

dateTime No No No No No No

duration, gMonth, gYear, gDay, gMonthDay,gYearMonth

No No No No No No

date No No No No No No

Name, NCName, NOTATION, ID, IDREF, QName,NMTOKEN, ENTITY

No No No No No No

ENTITIES, NMTOKENS, IDREFS, tipos de lista No No No No No No

anyURI No No No No No No

language No No No No No No

anySimpleType, tipos de unión No No No No No No

Notas

No Los tipos de datos no son compatibles para la descomposición de esquemas XML anotados.

1 Compatible si se cumplen las condiciones siguientes:v La serie cumple con las reglas de representación léxica del esquema XML para el tipo de

destino.v La serie se puede convertir al valor numérico sin truncamiento o pérdida de dígitos

significativos.

2 Compatible, y si -0 es el espacio de valor del tipo XML, -0 se almacena en la base de datos.

Programación SQL XML 129

Page 138: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

3 Compatible si el tipo XML se encuentra en el rango del tipo SQL. Si -0 está en el espacio de valordel tipo XML, se almacena -0 en la base de datos.

4 Compatible si el valor puede convertirse al valor numérico sin recorte o pérdida de dígitossignificativos. Si -0 está en el espacio de valor del tipo XML, se almacena -0 en la base de datos.

5 Compatible si el valor puede convertirse al valor numérico sin recorte o perdida de dígitossignificativos, y si el valor no es "INF", "-INF" o "NaN". -0 se almacena como 0 en la base dedatos.

6 Compatible si el valor no es "INF", "-INF" o "NaN". -0 se almacena como 0 en la base de datos.

7 Compatible, y el valor insertado es '0' (para false) o '1' (para true).

Tabla 40. Tipos de datos compatibles de esquema XML y SQL

Tipo de esquema XML

Tipo SQL

DECI

MAL

NUMERIC

string, normalizedString, token 1 1

base64Binary, No No

hexBinary No No

byte, unsigned byte 2 2

integer, positiveInteger, negativeInteger, nonNegativeInteger, nonPositiveInteger 4 4

int, unsignedInt 4 4

long, unsignedLong 4 4

short, unsignedShort 2 2

decimal 4 4

float 5 5

double 5 5

boolean 7 7

time No No

dateTime No No

duration, gMonth, gYear, gDay, gMonthDay, gYearMonth No No

date No No

Name, NCName, NOTATION, ID, IDREF, QName, NMTOKEN, ENTITY No No

ENTITIES, NMTOKENS, IDREFS, tipos de lista No No

anyURI No No

language No No

anySimpleType, tipos de unión No No

Notas

No Los tipos de datos no son compatibles para la descomposición de esquemas XML anotados.

1 Compatible si se cumplen las condiciones siguientes:v La serie cumple con las reglas de representación léxica del esquema XML para el tipo de

destino.v La serie se puede convertir al valor numérico sin truncamiento o pérdida de dígitos

significativos.

2 Compatible, y si -0 es el espacio de valor del tipo XML, -0 se almacena en la base de datos.

3 Compatible si el tipo XML se encuentra en el rango del tipo SQL. Si -0 está en el espacio de valordel tipo XML, se almacena -0 en la base de datos.

4 Compatible si el valor puede convertirse al valor numérico sin recorte o pérdida de dígitossignificativos. Si -0 está en el espacio de valor del tipo XML, se almacena -0 en la base de datos.

130 IBM i: Programación SQL XML

Page 139: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

5 Compatible si el valor puede convertirse al valor numérico sin recorte o perdida de dígitossignificativos, y si el valor no es "INF", "-INF" o "NaN". -0 se almacena como 0 en la base dedatos.

6 Compatible si el valor no es "INF", "-INF" o "NaN". -0 se almacena como 0 en la base de datos.

7 Compatible, y el valor insertado es '0' (para false) o '1' (para true).

Límites y restricciones para la descomposición de esquemas XML anotadosLa descomposición de esquemas XML anotados está sujeta a ciertos límites y restricciones.

Límites

Tabla 41. Límites para la descomposición de esquemas XML anotados

Condición Valor límite

Tamaño máximo de documento que se debedescomponer

2 GB

Número máximo de tablas a las que se hace referencia enun único esquema XML anotado

100

Longitud máxima de un valor de serie dedb2-xdb:expression

1024 bytes

Longitud máxima de un valor de serie dedb2-xdb:condition

1024 bytes

Número máximo de pasos en db2-xdb:locationPath 128

Número máximo de anotaciones exclusivas en unesquema XML

64 KB

Longitud máxima de serie del valor de db2-xdb:name(nombre de tabla), db2-xdb:column, db2-xdb:defaultSQLSchema o db2-xdb:SQLSchema

Igual que el límite del objeto DB2 correspondiente

Longitud máxima de serie del valor de db2-xdb:rowSet Igual que el límite para db2-xdb:name

Restricciones

La descomposición de esquemas XML anotados no admite lo siguiente:v Descomposición de comodines de elemento o atributo

Los elementos o atributos del documento XML que corresponden a la declaración de <xs:any> o<xs:anyAttribute> en el esquema XML no se descomponen.No obstante, si estos elementos o atributos son hijos de elementos que se descomponen condb2-xdb:contentHandling establecido en serializeSubtree o stringValue, el contenido de loselementos o atributos comodín se descompone como parte del valor de serie o subárbol serializado.Estos elementos o atributos comodín deben satisfacer las restricciones de espacio de nombres que sehan especificado en las declaraciones de <xs:any> o <xs:anyAttribute> correspondientes.

v Grupos de sustituciónSe genera un error si un miembro de un grupo de sustitución aparece en un documento XML donde lacabecera del grupo aparece en el esquema XML.

v Sustitución en tiempo de ejecución mediante xsi:typeUn elemento se descompone según las correlaciones del tipo de esquema que está asociado con elnombre del elemento en el esquema XML. El uso de xsi:type para especificar un tipo diferente paraun elemento en el documento da como resultado un error de descomposición.

v Elementos recursivos (elementos que hacen referencia a sí mismos)Los esquemas XML anotados que contienen declaraciones de elemento recursivas no se puedenhabilitar para la descomposición.

Programación SQL XML 131

Page 140: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v Actualizaciones o supresiones de filas existentes en tablas de destinoActualmente, la descomposición sólo puede insertar nuevas filas en las tablas de destino.

v Restricciones referenciales entre tablas actualizadas mediante la descomposiciónPara evitar esta restricción, utilice esquemas anotados diferentes para varias operaciones dedescomposición en el mismo documento de instancia, a fin de controlar el orden de actualización delas tablas padre o hijo.

v Atributos de tipo simple derivados de NOTATION: la descomposición sólo inserta el nombre de lanotación.

v Atributos de tipo ENTITY: la descomposición sólo inserta el nombre de la entidad.v Varias correlaciones con el mismo rowSet y columna con db2-xdb:expression y db2-xdb:condition: si

varios elementos pueden correlacionarse legalmente con el mismo rowSet y columna, de acuerdo conlas reglas de correlación, las correlaciones no deben contener las anotaciones db2-xdb:expression odb2-xdb:condition.

Esquema para las anotaciones de descomposición XMLLa descomposición de esquemas XML anotados da soporte a un conjunto de anotaciones dedescomposición que permiten especificar cómo deben descomponerse e insertarse los documentos XMLen las tablas de la base de datos. Este tema muestra el esquema XML para el esquema anotado según lodefinido por la descomposición XML.<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns="http://www.ibm.com/xmlns/prod/db2/xdb1"targetNamespace="http://www.ibm.com/xmlns/prod/db2/xdb1"elementFormDefault="qualified" >

<xs:element name="defaultSQLSchema" type="xs:string"/><xs:attribute name="rowSet" type="xs:string"/><xs:attribute name="column" type="xs:string"/><xs:attribute name="locationPath" type="xs:string"/><xs:attribute name="truncate" type="xs:boolean"/><xs:attribute name="contentHandling">

<xs:simpleType><xs:restriction base="xs:string">

<xs:enumeration value="text"/><xs:enumeration value="serializeSubtree"/><xs:enumeration value="stringValue"/>

</xs:restriction></xs:simpleType>

</xs:attribute><xs:attribute name="normalization" >

<xs:simpleType><xs:restriction base="xs:string">

<xs:enumeration value="original"/><xs:enumeration value="whitespaceStrip"/><xs:enumeration value="canonical"/>

</xs:restriction></xs:simpleType>

</xs:attribute><xs:attribute name="expression" type="xs:string"/><xs:attribute name="condition" type="xs:string"/><xs:element name="table">

<xs:complexType><xs:sequence>

<xs:element name="SQLSchema" type="xs:string" minOccurs="0"/><xs:element name="name" type="xs:string"/><xs:element name="rowSet" type="xs:string"

maxOccurs="unbounded" form="qualified"/></xs:sequence>

</xs:complexType></xs:element><xs:element name="rowSetMapping">

<xs:complexType><xs:sequence>

132 IBM i: Programación SQL XML

Page 141: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<xs:element name="rowSet" type="xs:string" /><xs:element name="column" type="xs:string" minOccurs="0"/><xs:element name="expression" type="xs:string" minOccurs="0" /><xs:element name="condition" type="xs:string" minOccurs="0"/>

</xs:sequence><xs:attribute ref="truncate" /><xs:attribute ref="locationPath" /><xs:attribute ref="normalization" /><xs:attribute ref="contentHandling" />

</xs:complexType></xs:element><xs:element name=’rowSetOperationOrder’>

<xs:complexType><xs:choice minOccurs=’1’ maxOccurs=’1’>

<xs:element name=’order’ type=’orderType’ minOccurs=’1’maxOccurs=’unbounded’/>

</xs:choice></xs:complexType>

</xs:element><xs:complexType name=’orderType’>

<xs:sequence><xs:element name=’rowSet’ type=’xsd:string’ minOccurs=’2’maxOccurs=’unbounded’/>

</xs:sequence></xs:complexType>

</xs:schema>

Modelo de datos XMLEl modelo de datos XML sigue el modelo de datos XPath 2.0 y XQuery 1.0. Este modelo de datosproporciona una representación abstracta de uno o más documentos o fragmentos XML.

El objetivo del modelo de datos es definir todos los valores permitidos de expresiones en XPath, incluidoslos valores que se utilizan durante los cálculos intermedios. Cada expresión XPath toma como entradauna instancia del modelo de datos y devuelve una instancia del modelo de datos. El modelo de datosXML se describe en términos de secuencias y elementos, valores atómicos y nodos.

Secuencias y elementosEl modelo de datos de XPath se basa en el concepto de secuencia. El valor de una expresión XPath essiempre una secuencia. Una secuencia es una colección ordenada de cero o más elementos. Un elementoes un valor atómico o un nodo.

Una secuencia puede contener nodos, valores atómicos o cualquier combinación de nodos y valoresatómicos. Por ejemplo, cada uno de los valores siguientes puede representarse como una sola secuencia:v 36v <dog/>v (2, 3, 4)v (36, <dog/>, "cat")v ()v Un documento XML

Un nodo puede aparecer en más de una secuencia, y una secuencia puede contener elementosduplicados. Una secuencia no puede formar parte de otra secuencia. Dicho de otro modo, las secuenciasno pueden anidarse. Cuando se combinan dos secuencias, el resultado es siempre una secuencia de nodosy valores atómicos consecutivos. Por ejemplo, la adición de la secuencia (2, 3) a la secuencia (3, 5, 6) dacomo resultado la secuencia única (3, 5, 6, 2, 3). La combinación de estas secuencias no genera lasecuencia (3, 5, 6, (2, 3)) porque nunca se generan secuencias anidados.

Programación SQL XML 133

Page 142: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Un único elemento que aparece solo se modela como una secuencia que contiene un elemento. Porejemplo, no existe ninguna distinción entre la secuencia (2) y el valor atómico 2.

Una secuencia que contiene cero elementos se denomina secuencia vacía. Las secuencias vacías puedenutilizarse para representar información que falta o es desconocida.

Valores atómicosUn valor atómico es una instancia de uno de los tipos de datos atómicos incorporados definidos por elesquema XML.

Estos tipos de datos incluyen series, enteros, decimales, fechas y otros tipos atómicos. Estos tipos sedescriben como "atómicos" porque no se pueden subdividir. Algunos tipos atómicos tienen valoresliterales. Por ejemplo, los literales siguientes son valores atómicos:v "esto es una serie"v 45v 1.44

Otros tipos atómicos tienen funciones de constructor para construir valores atómicos a partir de series.Por ejemplo, la función de constructor siguiente crea un valor de tipo xs:decimal a partir de la serie"12.34":xs:decimal("12.34")

NodosUn nodo se ajusta a uno de los tipos de nodos definidos para XPath. Estos tipos de nodo son: documento,elemento, atributo, texto, instrucción de proceso, comentario y espacio de nombres.

Los nodos de una secuencia forman uno o más árboles que constan de un nodo de documento y todoslos nodos que son accesibles directa o indirectamente desde el nodo de documento. Cada nodo perteneceexactamente a un árbol y cada árbol tiene exactamente un nodo de documento. Un árbol cuyo nodo raízes un nodo de documento se conoce como documento. Un árbol cuyo nodo raíz no es un nodo dedocumento se conoce como fragmento.

El documento XML siguiente incluye un elemento de documento, denominado product, que contiene unelemento description. El elemento product tiene un atributo denominado pid (ID de orden de compra).El elemento description contiene elementos denominados name, details, price y weight.<product xmlns="http://posample.org" pid="100-101-01">

<description><name>Snow Shovel, Deluxe 24"</name><details>A Deluxe Snow Shovel, 24 inches wide, ergonomic

curved handle with D-Grip</details><price>19.99</price><weight>2 kg</weight>

</description></product>

Identidad de nodo

Cada nodo tiene una identidad exclusiva. Esto significa que dos nodos son distinguibles, aunque susnombres y valores puedan ser iguales. En cambio, los valores atómicos no tienen una identidad. Cadainstancia de un valor atómico (por ejemplo, el entero 7) es idéntica a cualquier otra instancia de ese valor.

134 IBM i: Programación SQL XML

Page 143: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Orden de documento

Entre todos los nodos de una jerarquía, existe un orden global denominado orden de documento, en elque cada nodo aparece antes de sus hijos. El orden de documento corresponde al orden en el queaparecen los nodos cuando la jerarquía de nodos se representa en formato XML:v El nodo de documento es el primer nodo.v Los nodos de elemento aparecen antes de sus hijos.v Los nodos de espacio de nombres aparecen inmediatamente después del nodo de elemento con el que

están asociados.v Los nodos de atributo aparecen después de los nodos de espacio de nombres, o de su nodo de

elemento asociado, si no existen nodos de espacio de nombres.Los nodos de atributo y los nodos de espacio de nombres no son hijos de un nodo de elemento, pero elnodo de elemento asociado es su nodo padre.El orden relativo de los nodos de atributo es arbitrario, pero este orden no cambia durante el procesode una expresión XPath.

v Los nodos de elemento, nodos de texto, nodos de instrucción de proceso y nodos de comentariopueden ser hijos de un nodo de elemento o de un nodo de documento.

v El orden relativo de los hermanos está determinado por su orden en la jerarquía de nodos.v Los hijos y descendientes de un nodo aparecen antes de los hermanos que siguen al nodo.

Propiedades de nodo

Cada nodo tiene propiedades que describen las características de ese nodo. Por ejemplo, las propiedades deun nodo pueden incluir el nombre del nodo, sus hijos, su padre, sus atributos y demás información quedescribe el nodo. La clase de nodo determina qué propiedades están presentes para nodos específicos.

Un nodo puede tener una o más de las propiedades siguientes:

node nameEl nombre del nodo (expresado como un QName).

parent El nodo que es el padre del nodo actual.

type nameEl tipo dinámico (tiempo de ejecución) del nodo.

childrenLa secuencia de nodos que son hijos del nodo actual.

attributesEl conjunto de nodos de atributo que pertenecen al nodo actual.

string valueUn valor de serie que se puede extraer del nodo.

typed valueUna secuencia de cero o más valores atómicos que se pueden extraer del nodo.

target Identifica la aplicación a la que va dirigida una instrucción de proceso. El destino es un NCName(nombre local sin signos de dos puntos).

contentEl contenido de una instrucción de proceso, nodo de texto o nodo de comentario.

Nodos de documentoUn nodo de documento encapsula un documento XML.

Programación SQL XML 135

Page 144: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Un nodo de documento no puede tener nodos padre y puede tener cero o más nodos hijo. Los nodos hijopuede incluir nodos de elemento, nodos de texto, nodos de instrucción de proceso o nodos decomentario. Para ser un documento bien formado, el nodo de documento debe tener exactamente unnodo de elemento hijo y ningún nodo de texto hijo.

Un nodo de documento tiene las siguientes propiedades de nodo:v childrenv string valuev typed value

Para un nodo de documento, el valor de serie es la concatenación de todos los valores de serie de todoslos nodos de texto descendientes, por orden de documento y el valor con tipo es el mismo que el valorde serie de tipo xs:untypedAtomic.

Por ejemplo, supongamos que un documento tiene la representación textual siguiente:<product xmlns="http://posample.org" pid="100-101-01">

<description><name>Snow Shovel, Deluxe 24"</name><details>A Deluxe Snow Shovel, 24 inches wide, ergonomic

curved handle with D-Grip</details><price>19.99</price><weight>2 kg</weight>

</description>

El nodo de documento tiene los siguientes valores de propiedad:

Tabla 42. Propiedades del nodo de documento

Propiedad de nodo Valor Tipo de valor

children nodo product

string value "Snow Shovel, Deluxe 24"A Deluxe SnowShovel, 24 inches wide, ergonomic curvedhandle with D-Grip19.992 kg"

xs:string

typed value "Snow Shovel, Deluxe 24"A Deluxe SnowShovel, 24 inches wide, ergonomic curvedhandle with D-Grip19.992 kg"

xs:untypedAtomic

Nodos de elementoUn nodo de elemento encapsula un elemento XML.

Un elemento puede tener cero o un padre y cero o más hijos. Los hijos pueden incluir nodos deelemento, nodos de instrucción de proceso, nodos de comentario y nodos de texto. Los nodos dedocumentos y atributo nunca son hijos de nodos de elemento. Sin embargo, un nodo de elemento seconsidera que es el padre de sus atributos. Los atributos de un nodo de elemento debe tener QNamesexclusivos.

Un nodo de elemento tiene las siguientes propiedades de nodo:v node namev parentv type name (El nombre de tipo de un nodo de elemento en DB2 es siempre xs:untyped.)v childrenv attributesv string valuev typed value

136 IBM i: Programación SQL XML

Page 145: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v in-scope namespaces

Para un nodo de elemento, el valor de serie es la concatenación de los valores de serie de todos susdescendientes de nodo de texto en el orden del documento. Si el elemento está vacío, el valor de serie esla serie vacía " ". El valor con tipo de un elemento es uno de los valores siguientes:v Si el elemento puede ser nulo, el valor con tipo es ().v Si el elemento está vacío, el valor con tipo es la serie vacía ( ).v De lo contrario, el valor con tipo es el valor de serie como tipo xs:untypedAtomic.

Por ejemplo, supongamos que un documento tiene la representación textual siguiente:<product xmlns="http://posample.org" pid="100-101-01">

<description><name>Snow Shovel, Deluxe 24"</name><details>A Deluxe Snow Shovel, 24 inches wide, ergonomic

curved handle with D-Grip</details><price>19.99</price><weight>2 kg</weight>

</description>

El nodo de elemento product tiene los siguientes valores de propiedad:

Tabla 43. Propiedades del nodo product

Propiedad de nodo Valor Tipo de valor

node name product

parent nodo de documento

type name xs:untyped

children nodo description

attributes pid

string value "Snow Shovel, Deluxe 24"A Deluxe Snow Shovel, 24inches wide, ergonomic curved handle withD-Grip19.992 kg"

xs:string

typed value "Snow Shovel, Deluxe 24"A Deluxe Snow Shovel, 24inches wide, ergonomic curved handle withD-Grip19.992 kg"

xs:untypedAtomic

in-scope namespaces (predeterminado, http://posample.org)

El nodo de elemento name tiene los siguientes valores de propiedad:

Tabla 44. Propiedades del nodo name

Propiedad de nodo Valor Tipo de valor

node name name

parent nodo description

type name xs:untyped

children nodo de texto "Snow Shovel, Deluxe 24" "

attributes ninguno

string value "Snow Shovel, Deluxe 24" " xs:string

typed value "Snow Shovel, Deluxe 24" " xs:untypedAtomic

in-scope namespaces (predeterminado, http://posample.org)

Programación SQL XML 137

Page 146: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Nodos de atributoUn nodo de atributo representa un atributo XML.

Un nodo de atributo puede tener un padre o no tener ninguno. El nodo de elemento que posee unatributo se considera como su padre, aunque un nodo de atributo no es hijo de su elemento padre.

Un nodo de atributo tiene las propiedades de nodo siguientes:v node namev parentv type name (El nombre del tipo de un nodo de atributo en DB2 es siempre xs:untypedAtomic.)v string valuev typed value

Para un nodo de atributo, el valor de serie es el valor normalizado del atributo o el valor normalizadodel esquema del atributo si el atributo se ha validado con un esquema. El valor con tipo es el mismo queel valor de serie de tipo xs:untypedAtomic.<product xmlns="http://posample.org" pid="100-101-01">

<description><name>Snow Shovel, Deluxe 24"</name><details>A Deluxe Snow Shovel, 24 inches wide, ergonomic

curved handle with D-Grip</details><price>19.99</price><weight>2 kg</weight>

</description>

El atributo pid tiene los siguientes valores de propiedad:

Tabla 45. Propiedades del nodo de atributo pid

Propiedad de nodo Valor Tipo de valor

node name pid

parent nodo product

type name xs:untypedAtomic

string value "100-101-01" xs:string

typed value 100-101-01" xs:untypedAtomic

Nodos de textoUn nodo de texto encapsula contenido de caracteres XML.

Un nodo de texto puede tener un padre o ninguno. El contenido de un nodo de texto puede estar vacío.Sin embargo, a menos que el padre de un nodo de texto esté vacío, el contenido del nodo de texto nopuede ser una serie vacía. Los nodos de texto que son hijos de un nodo de documento o elemento nuncaaparecen como hermanos adyacentes. Durante la construcción del nodo de documento o elemento, loshermanos adyacentes se combinan en un único nodo de texto. Si el nodo de texto resultante está vacío, sedescarta.

Los nodos de texto tienen las propiedades de nodo siguientes:v contentv parent

Por ejemplo, supongamos que un documento tiene la representación textual siguiente:<product xmlns="http://posample.org" pid="100-101-01">

<description><name>Snow Shovel, Deluxe 24"</name>

138 IBM i: Programación SQL XML

Page 147: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<details>A Deluxe Snow Shovel, 24 inches wide, ergonomiccurved handle with D-Grip</details>

<price>19.99</price><weight>2 kg</weight>

</description>

El nodo de texto bajo el nodo de elemento name tiene los siguientes valores de propiedad:

Tabla 46. Propiedades del nodo de texto name

Propiedad de nodo Valor

content Snow Shovel, Deluxe 24"

parent name

El valor de serie de un nodo de texto es el contenido del nodo, que en el ejemplo anterior es "SnowShovel, Deluxe 24" ". El valor con tipo de un nodo de texto es el mismo valor que el valor de serie y esde tipo xs:untypedAtomic.

Nodos de instrucción de procesoUn nodo de instrucción de proceso encapsula una instrucción de proceso XML.

Un nodo de instrucción de proceso puede tener ninguno o un padre. El destino de una instrucción deproceso debe ser un NCName (un nombre local sin signos de dos puntos).

Un nodo de instrucción de proceso tiene las siguientes propiedades de nodo:v targetv contentv parent

Por ejemplo, considere la instrucción de proceso siguiente:<?xml-stylesheet href="book.css" type="text/css"?>

Esta instrucción de proceso tiene los siguientes valores de propiedad:

Tabla 47. Propiedades del nodo de instrucción de proceso

Propiedad de nodo Valor

target xml-stylesheet

content href="book.css" type="text/css"

parent nodo de documento

El valor de serie de un nodo de instrucción de proceso es el contenido del nodo, que en este caso eshref="book.css" type="text/css". El valor con tipo es el mismo valor que el valor de serie y también esde tipo xs:string.

Nodos de comentarioUn nodo de comentario encapsula comentarios XML.

Un nodo de comentario puede tener un padre o no tener ninguno.

Un nodo de comentario tiene las propiedades de nodo siguientes:v contentv parent

Programación SQL XML 139

Page 148: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Por ejemplo, considere el siguiente contenido:<ID>

<!-- Este elemento contiene un número de ID. -->101</ID>

Este comentario tiene los siguientes valores de propiedad:

Tabla 48. Propiedades del nodo de comentario

Propiedad de nodo Valor

content Este elemento contiene un número de ID.

parent nodo ID

El valor de serie de un nodo de comentario es el contenido del nodo, que en el caso del ejemplo anteriores Este elemento contiene un número de ID. El valor con tipo es el mismo valor que el valor de serie ytambién es de tipo xs:string.

Generación de modelos de datosAntes de que una expresión XPath pueda procesarse, los documentos de entrada debe estar representadosen el modelo de datos XML.

Un documento XML de entrada se transforma en una instancia del modelo de datos XML a través de unproceso denominado análisis XML. De forma alternativa, puede generar una instancia del modelo dedatos XML mediante constructores XML SQL, como por ejemplo XMLELEMENT y XMLATTRIBUTES.Estas funciones incorporadas permiten generar datos XML a partir de datos relacionales. Del mismomodo, el resultado de una expresión XPath puede transformarse en una representación XML a través deun proceso denominado serialización XML.v Durante el análisis de XML, la representación de serie de un documento XML se transforma en una

instancia del modelo XPath. Opcionalmente, el documento XML puede validarse contra un esquemaespecífico. Los datos analizados se representan como una jerarquía de nodos y valores atómicos. Cadavalor atómico, nodo de elemento y nodo de atributo del modelo de datos XPath se anota con un tipodinámico. El tipo dinámico especifica un rango de valores. Por ejemplo, un atributo denominadoversion puede tener el tipo dinámico xs:decimal para indicar que el atributo contiene un valordecimal.Restricción: si el documento XML se valida con respecto a un esquema, DB2 no mantiene la anotaciónde tipo para cada nodo. Los datos se almacenan sin tipo.El valor de un atributo está representado directamente en el nodo de atributo. Un nodo de atributo detipo desconocido se anota con el tipo dinámico xs:untypedAtomic.El valor de un elemento está representado por los hijos del nodo de elemento, que pueden incluirnodos de texto y otros nodos de elemento. El tipo dinámico de un nodo de elemento indica cómodeben interpretarse los valores en los nodos de texto hijos. Todos los nodos de elemento tienen el tipoxs:sin.Un valor atómico de tipo desconocido se anota con el tipo xs:untypedAtomic.Si un documento de entrada no tiene ningún esquema, el documento no se valida. DB2 asigna losnodos y valores atómicos como sin tipo (xs:untyped or xs:untypedAtomic).

v Durante la serialización, la secuencia de nodos y valores atómicos (la instancia del modelo de datosXPath) se convierte a su representación de serie. El resultado de la serialización no siempre representaun documento bien formado. De hecho, la serialización puede dar como resultado un único valoratómico (por ejemplo, 17) o una secuencia de elementos que no tienen un padre común.

140 IBM i: Programación SQL XML

Page 149: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Valores XML en SQLEn términos del modelo de datos XQuery/XPath 2.0, el SQL de DB2 for i define un valor XML como unasecuencia que contiene un único nodo de documento, con un subárbol que incluye el contenido deldocumento. La representación de un valor XML como un nodo de documento garantiza que el valor sepueda serializar como una representación de caracteres que represente exactamente el valor XML. Estadefinición se conoce como XML(CONTENT) en 2008 Database Language SQL Part 14 - XML-RelatedSpecifications (ISO 9075-14).

Para garantizar que el valor XML es de tipo XML(CONTENT), un nodo de documento se crea cuando secrea o se copia un valor XML dentro de SQL.

Durante la construcción del nodo de documento se realiza el proceso siguiente:1. Si la secuencia de contenido contiene un nodo de documento, el nodo de documento se sustituye por

sus hijos.2. Los valores atómicos de la secuencia de contenido se convierten en series y se almacenan en nodos de

texto, que se convierten en hijos del documento construido.3. Los nodos de texto adyacentes de la secuencia de contenido se fusionan en un único nodo de texto.4. Si la secuencia de contenido contiene un nodo de atributo, se genera un error.

No se efectúa ninguna validación en el nodo de documento. Las reglas de XML 1.0 que rigen laestructura de un documento XML (por ejemplo, el nodo de documento debe tener exactamente un hijoque sea un nodo de elemento) no se aplican durante la construcción del valor XML.

Por ejemplo:XMLCONCAT(XMLTEXT(’nodo de texto uno’), XMLTEXT(’nodo de texto dos’))

El valor XML resultante se representara como una secuencia de un único nodo de documento, con unúnico nodo de texto hijo 'nodo de texto uno nodo de texto dos'. La representación es coherente con undocumento XML serializado.

Otras implementaciones de la especificación (incluido DB2 for z/OS y DB2 for LUW) pueden definir eltipo XML SQL como una secuencia de XQuery/XPath 2.0 que puede contener cualquier número deelementos de cualquier tipo de nodo o valor atómico. Esta definición no garantiza que el valor puedaserializarse como una representación de caracteres que represente exactamente la secuencia. Este tipo seconoce como XML(SEQUENCE) en la especificación y es un superconjunto de XML(CONTENT).

Las implementaciones de SQL que crean un valor de tipo XML(SEQUENCE) representarán el resultadode la expresión XMLCONCAT anterior como una secuencia de dos nodos de texto adyacentes (sin nodode documento padre): ('nodo de texto uno', 'nodo de texto dos') .

En la mayoría de los casos, esta diferencia en la representación no es significativa. Cuando se serializa unvalor XML(SEQUENCE), primero debe convertirse a XML(CONTENT) utilizando el mismo proceso quese realiza cuando se crea un valor XML(CONTENT). Por tanto, la serialización de un valor XML produceel mismo resultado independientemente del tipo XML utilizado por la implementación.

Además, los documentos XML con formato correcto obtenidos de una columna de una tabla, una variablede lenguaje principal, un marcador de parámetro o mediante la utilización de la función incorporadaXMLPARSE contienen un nodo de documento raíz. Esto hace que el valor XML ya sea del tipo másespecífico XML(CONTENT), incluso en entornos que implementan el tipo más generalXML(SEQUENCE).

Pueden producirse resultados diferentes en un pequeño número de casos en los que un valor XML seconstruye en SQL y es evaluado por una expresión XPath.

Programación SQL XML 141

Page 150: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Por ejemplo:select XMLSERIALIZE(OUTPUT_COL AS VARCHAR(100)) fromXMLTABLE(’$d_or_e/root/child’

passing XMLELEMENT(NAME "root",XMLELEMENT(NAME "child",

XMLTEXT(’hello world’))) as "d_or_e") X(OUTPUT_COL);

DB2 for i asignará $d_or_e a un nodo de documento que representa el valor XML, la expresión de pasose evaluará y se devolverá la salida esperada <child>hello world</child>. "root" es un elemento hijodel nodo de documento.

Sin embargo, DB2 for LUW y DB2 for z/OS asignarán $d_or_e a un elemento "root". Dado que elelemento "root" no tiene ningún hijo llamado "root", esta consulta no devolverá ninguna fila.

La forma correcta de suministrar una solución completamente independiente de la plataforma consiste enescribir este tipo de consulta de modo que se construya explícitamente un nodo de documento, lo cualobliga a que la representación sea equivalente en todas las plataformas para ajustarse a lasespecificaciones.select XMLSERIALIZE(OUTPUT_COL AS VARCHAR(100)) fromXMLTABLE(’$d_or_e/root/child’ passing

XMLDOCUMENT(XMLELEMENT(NAME "root",

XMLELEMENT(NAME "child",XMLTEXT(’hello world’)))

) as "d_or_e") X(OUTPUT_COL);

La construcción explícita de un nodo de documento no es necesaria para los valores XML que segarantiza que son XML(CONTENT), como por ejemplo cuando:v el valor se obtiene de la aplicación a través de una variable del lenguaje principal o marcador de

parámetro,v el valor procede de una columna de una tabla de DB2, ov el valor XML se ha creado explícita o implícitamente utilizando la función incorporada XMLPARSE.

Visión general de XPathXPath es un lenguaje de expresión diseñado por World Wide Web Consortium (W3C) para permitir elprocesamiento de datos XML que se ajustan al modelo de datos XQuery 1.0 y XPath 2.0. XQuery es unlenguaje de programación funcional diseñado por World Wide Web Consortium (W3C) para satisfacerrequisitos específicos de consulta y modificación de datos XML. DB2 XPath da soporte a un subconjuntode las construcciones de lenguaje de la recomendación XPath 2.0.

El lenguaje XPath proporciona varios tipos de expresiones que se pueden construir a partir de palabrasclave, símbolos y operandos. En la mayoría de los casos, los operandos de diversas expresiones,operadores y funciones deben ajustarse a los tipos esperados. DB2 ignora los errores de tipo endeterminadas situaciones.

DB2 XPath puede utilizarse como argumento para la función de tabla incorporada SQL XMLTABLE, quese utiliza para convertir un valor XML en un conjunto de resultados relacionales.

Expresiones XPath

El bloque de creación básico de XPath es la expresión. DB2 XPath suministra varios tipos de expresionespara trabajar con datos XML:v Expresiones primarias, que incluyen los primitivos básicos del lenguaje, como literales, referencias de

variables y llamadas de función

142 IBM i: Programación SQL XML

Page 151: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v Expresiones de vía de acceso para localizar nodos dentro de un árbol de documentosv Expresiones aritméticas de suma, resta, multiplicación, división y módulov Expresiones de comparación para comparar dos valoresv Expresiones lógicas para utilizar lógica booleana

Las expresiones XPath pueden formarse de modo totalmente general, lo que significa que, allí donde seespera una expresión, puede utilizarse cualquier tipo de expresión. En general, los operandos de unaexpresión son otras expresiones. En el ejemplo siguiente, los operandos de una expresión lógica son lasexpresiones de comparación 1 = 1 y 2 = 2:1 = 1 and 2 = 2

Proceso de XPath

Una expresión XPath consta de un prólogo opcional que establece el entorno de proceso y una expresiónque genera un resultado. El proceso de XPath se realiza en dos fases: la fase de análisis estático y la fasede evaluación dinámica.

Durante la fase de análisis estático, la expresión se analiza y aumenta en función de la información que seha definido en el prólogo. El contexto estático se utiliza para resolver los nombres de tipo, nombres defunción y nombres de variables utilizados en la expresión. El contexto estático incluye toda la informaciónque está disponible antes de evaluar una expresión. La fase estática se produce cuando la expresión seevalúa por primera vez. Si un nombre necesario no se encuentra en el contexto estático, se genera unerror.

La fase de evaluación dinámica se produce si no se han detectado errores durante la fase de análisisestático. Durante la fase de evaluación dinámica, se calcula el valor de la expresión. Un tipo dinámico seasocia con cada valor cuando éste se calcula. Si un operando de una expresión tiene un tipo dinámicoque no coincide con el tipo esperado, se genera un error de tipo. Si la evaluación no genera errores, sedevuelve un resultado. El contexto dinámico incluye la información que está disponible en el momento deevaluar la expresión.

El resultado de una expresión XPath es, en general, una secuencia heterogénea de nodos XML y valoresatómicos. Más concretamente, el resultado de una expresión XPath es una instancia del modelo de datosXPath.

El modelo de datos de XPath 2.0 y XQuery 1.0

El modelo de datos de XPath 2.0 y XQuery 1.0 representa un documento XML como una jerarquía (árbol)de nodos que representan elementos y atributos XML. Cada valor del modelo de datos es una secuenciaque puede contener cero, uno o más elementos. Los elementos pueden ser valores atómicos o nodos.Cada expresión XPath toma como entrada una instancia del modelo de datos de XPath 2.0 y XQuery 1.0y devuelve una instancia del modelo de datos de XPath 2.0 y XQuery 1.0.

Tipos de datos de DB2 XPath

DB2 XPath da soporte a los tipos de datos siguientes:v xs:integerv xs:decimalv xs:doublev xs:stringv xs:booleanv xs:untypedAtomicv xs:date

Programación SQL XML 143

Page 152: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v xs:dateTimev xs:timev xs:durationv xs:yearMonthDurationv xs:dayTimeDuration

DB2 comprueba los tipos de datos durante la fase de evaluación dinámica y la fase de análisis estático.Cuando una expresión encuentra un tipo inadecuado, se genera un error de tipo. Por ejemplo, unaexpresión XPath que utiliza el operador más (+) para añadir dos series juntas da como resultado un errorde tipo porque el operador de suma sólo se utiliza en una expresión aritmética para añadir valoresnuméricos, yearMonthDuration y dayTimeDuration. Cuando es posible, se realizan conversiones de tipo ysustituciones de tipo implícitas para proporcionar el tipo esperado por una expresión.

La biblioteca de funciones incorporadas

DB2 XPath proporciona una biblioteca de funciones incorporadas para trabajar con datos XML. Labiblioteca incluye los siguientes tipos de funciones:v Funciones de seriev Funciones numéricasv Funciones de fecha y horav Funciones que operan en valores booleanosv Funciones que operan en secuencias

Estas funciones incorporadas se encuentran en el espacio de nombres con el URI http://www.w3.org/2005/xpath-functions, que de forma predeterminada está asociado con el prefijo fn. El espacio denombres de función predeterminado se establece en fn de forma predeterminada, lo que significa quepuede llamar a las funciones de este espacio de nombres sin especificar un prefijo.

Pueden utilizarse llamadas de función en cualquier lugar de una expresión XPath donde se espere unaexpresión.

Sensibilidad a las mayúsculas y minúsculas en DB2 XPathXPath es un lenguaje sensible a las mayúsculas y minúsculas.

En XPath, las palabras clave utilizan caracteres en minúsculas y no están reservadas. Los nombres enexpresiones XPath pueden ser iguales que las palabra claves de idioma.

Espacios en blanco en DB2 XPathLos espacios en blanco están permitidos en la mayoría de las expresiones XPath para mejorar lalegibilidad aunque el espacio en blanco no forme parte de la sintaxis de la expresión. El espacio en blancoconsta de caracteres de espacio (U+0020), retornos de carro (U+000D), saltos de línea (U+000A) ytabulaciones (U+0009).

En general, el espacio en blanco no es significativo en una expresión XPath, excepto en las siguientessituaciones en las que se conserva el espacio en blanco:v El espacio en blanco se encuentra en un literal de serie.v El espacio en blanco aclara una expresión impidiendo que dos símbolos adyacentes se reconozcan

erróneamente como uno solo.

Los ejemplos siguientes incluyen expresiones que requieren espacio en blanco para mayor claridad:v one- two genera un error de sintaxis. El analizador reconoce one- como un único QName (nombre

calificado) y genera un error cuando no encuentra ningún operador.

144 IBM i: Programación SQL XML

Page 153: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v one -two no genera un error de sintaxis. El analizador reconoce one como un QName, el signo menos(-) como un operador y luego two como otro QName.

v one-two no genera un error de sintaxis. Sin embargo, la expresión se analiza como un solo QNameporque un guión (-) es un carácter válido en un QName.

v Todas las expresiones siguientes generarán errores de sintaxis:– 5 div2

– 5div2

En estas expresiones, el espacio en blanco es necesario para que el analizador reconozca cada símbolopor separado. Observe que 5div 2 no genera un error de sintaxis.

Comentarios en DB2 XPathLos comentarios se permiten en una expresión XPath, dondequiera que se permitan espacios blanco noesenciales. Los comentarios no afectan al proceso de la expresión.

Un comentario es una serie de caracteres delimitada por los símbolos (: y :). El ejemplo siguiente es uncomentario en XPath:(: Esto es un comentario. Facilita la comprensión del código. :)

La utilización de comentarios en DB2 XPath está sujeta a las siguientes reglas genéricas:v Pueden utilizarse comentarios dondequiera que se permitan espacios en blanco no esenciales. Un

espacio en blanco no esencial es un espacio en blanco que no forma parte de la sintaxis de una expresiónXPath.

v Los comentarios pueden estar anidados entre sí, pero cada comentario anidado debe tenerdelimitadores de apertura y de cierre, (: y :).

Los ejemplos siguientes ilustran comentarios permitidos y comentarios que generan errores:v (: ¿es esto un comentario? ::) es un comentario correcto.v (: ¿es esto un comentario? ::) ¿o un error? :) genera un error porque existe un anidamiento

desequilibrado de los símbolos (: y :).v (: comentar un (: comentario :) puede ser confuso, pero a menudo útil :) es un comentario

correcto porque se permite un anidamiento de comentarios equilibrado.v "esto es sólo una serie :)" es una expresión correcta.v (: "esto es sólo una serie :)" :) genera un error de sintaxis. Del mismo modo, "esto es otra

serie (:" es una expresión correcta, pero (: "esto es otra serie (:" :) genera un error de sintaxis.El contenido literal puede generar un anidamiento de comentarios desequilibrado.

Juego de caracteresEl modelo de DB2 XPath utiliza la codificación UTF-8. DB2 convertirá todos los parámetros de entradaXML, de caracteres y gráficos a UTF-8. Convertirá los datos de salida de UTF-8 al CCSID especificadopara la columna de resultados.

Ordenación predeterminadaDB2 XPath determina la ordenación predeterminada de la expresión XPath a partir de la secuencia declasificación utilizado para la sentencia SQL que contiene XMLTABLE. DB2 XPath admite secuencias declasificación binarias (*HEX) y secuencias de clasificación Unicode utilizando ICU (Componentesinternacionales para Unicode).

Programación SQL XML 145

Page 154: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Espacios de nombres XML y nombres calificados en DB2 XPathDB2 XPath utiliza espacios de nombres XML para evitar conflictos de denominación. Un espacio denombres XML es una colección de nombres identificada por un URI de espacio de nombres. Los espaciosde nombres proporcionan una forma de calificar los nombres utilizados para los elementos, atributos,tipos de datos y funciones en XPath.

En XPath, los nombres se denominan QNames (nombres calificados) y se ajustan a la sintaxis definida enEspacios de nombres en XML de la recomendación W3C. Un QName consta de un prefijo de espacio denombres opcional y un nombre local. El prefijo de espacio de nombres, si está presente, está enlazado aun URI y proporciona una forma abreviada del URI. Durante el proceso de la consulta, DB2 XPathamplía el QName resolviendo el URI que está enlazado al prefijo de espacio de nombres. El QNameampliado incluye el URI de espacio de nombres y un nombre local. Dos QNames son iguales si tienen elmismo URI de espacio de nombres y nombre local. Esto significa que dos QNames pueden coincidiraunque tengan prefijos diferentes, siempre y cuando los prefijos estén enlazados al mismo URI de espaciode nombres.

La utilización de QNames en XPath permite que las expresiones hagan referencia a tipos de elemento onombres de atributo que tienen el mismo nombre local, pero que pueden estar asociados con diferentesDTD o esquemas XML. En los siguientes datos XML, pfx1 es un prefijo que está enlazado a un URI. pfx2es un prefijo que está enlazado a un URI diferente. c es el nombre local para los tres elementos:<a xmlns:pfx1="uri1" xmlns:pfx2="uri2"><b><pfx1:c>C</pfx1:c><pfx2:c>B</pfx2:c><c>A</c>

</b></a>

Los elementos de este ejemplo comparten el mismo nombre local, c, pero no se producen conflictos dedenominación porque los elementos existen en espacios de nombres diferentes. Durante el proceso de laexpresión, el nombre pfx1:c se amplía en un nombre que incluye el URI enlazado a pfx1 (uri1) y elnombre local, c. Del mismo modo, el nombre pfx2:c se amplía en un nombre que incluye el URIenlazado a pfx2 (uri2) y el nombre local, c. El elemento c, que tiene un prefijo vacío, se enlaza con elespacio de nombres de elemento predeterminado porque no se especifica ningún prefijo. Se genera unerror si un nombre utiliza un prefijo que no está enlazado a un URI.

El prefijo de espacio de nombres debe ser un NCName (nombre sin dos puntos). Un NCName XML essimilar a un nombre XML excepto en que el NCName no puede incluir un signo de dos puntos.

Algunos espacios de nombres están predeclarados; otros pueden añadirse a través de declaraciones en elprólogo de una expresión XPath. DB2 XPath incluye los siguientes prefijos de espacio de nombrespredeclarados:

Prefijo URI Descripción

xs http://www.w3.org/2001/XMLSchema Espacio de nombres deesquema XML

xsi http://www.w3.org/2001/XMLSchema-instance Espacio de nombres deinstancia de esquema XML

fn http://www.w3.org/2005/xpath-functions Espacio de nombres de funciónpredeterminado

xdt http://www.w3.org/2005/xpath-datatypes Espacio de nombres de tiposXPath

db2-fn http://www.ibm.com/xmlns/prod/db2/functions Espacio de nombres de funciónDB2

146 IBM i: Programación SQL XML

Page 155: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Además de los espacios de nombres predeclarados, pueden especificarse espacios de nombres con losprocedimientos siguientes:v La información de espacio de nombres siguiente está disponible en el contexto estático:

– Los espacios de nombres en ámbito son un conjunto de pares de prefijo y URI. Los espacios de nombresen ámbito se utilizan para resolver los prefijos utilizados en QNames de una expresión XPath. Losespacios de nombres en ámbito proceden de los siguientes orígenes:- Declaraciones de espacio de nombres de una expresión XPath- La función incorporada XMLNAMESPACES de DB2 de la función incorporada XMLELEMENT,

XMLFOREST o XMLTABLE de DB2– El espacio de nombres de elemento o tipo predeterminado es el espacio de nombres que se utiliza para

cualquier QName sin prefijo que aparece donde se espera un nombre de elemento o tipo. El espaciode nombres de elemento o tipo predeterminado inicial es el espacio de nombres predeterminadosuministrado por una cláusula declare default element namespace en el prólogo de una expresiónXPath.

– El espacio de nombres de función predeterminado es el espacio de nombres asociado con funcionesincorporadas: http://www.w3.org/2003/11/xpath-functions. No hay funciones definidas por elusuario en XPath.

Sistema de tipos de XPathDB2 XPath es un lenguaje con tipos férreos en el que los operandos de diversas expresiones, operadores yfunciones se ajustan a los tipos esperados.

El sistema de tipos de DB2 XPath incluye un subconjunto de los tipos incorporados de esquema XML ylos tipos predefinidos de XPath.

Los tipos incorporados de esquema XML se encuentran en el espacio de nombreshttp://www.w3.org/2001/XMLSchema, que tiene el prefijo de espacio de nombres predeclarado xs. Algunos ejemplos de tiposde esquema incorporados son xs:integer y xs:string.

Visión general del sistema de tiposEl sistema de tipos de DB2 XPath incluye tipos atómicos simples y tipos complejos. Un tipo atómico simplees un tipo atómico primitivo o derivado que no contiene elementos ni atributos. Un tipo complejo puedeincluir contenido mixto o sólo de elementos.

Funciones de constructor para tipos incorporadosCada tipo atómico incorporado definido en el lenguaje de definición de esquemas XML tiene una funciónde constructor asociada.

Sintaxis

�� prefijo:tipo(valor) ��

prefijoPrefijo enlazado con el espacio de nombres para el tipo de datos. Este no es el prefijo que se enlazacon el espacio de nombres de función predeterminado.

tipoEl nombre no calificado del tipo de datos de destino.

valorEl valor que debe construirse. Si este valor es una secuencia vacía, se devuelve la secuencia vacía.

Si valor es ilegal para el tipo de datos de destino, la función del constructor devuelve un error.

Programación SQL XML 147

Page 156: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Valor devuelto

Si valor no es una secuencia vacía, el valor devuelto es una instancia de prefijo:tipo.

Si valor es una secuencia vacía, la función de constructor devuelve la secuencia vacía.

Ejemplo:

La función de constructor xs:integer(100) o la función de constructor xs:integer("100") devuelven elvalor xs:integer 100. Una función de constructor cuyo argumento es un nodo con el valor de tipo 100también devuelve el valor de tipo 100.

Tipos de datos genéricosLos tipos de datos genéricos dan soporte a cuyos tipos no son fuertes.

xs:anyType:

El tipo de datos xs:anyType es el tipo base para todos los tipos de datos definidos en el lenguaje dedefinición de esquemas XML.

xs:anySimpleType:

El tipo de datos xs:anySimpleType es el tipo base para todos los tipos primitivos definidos en el lenguajede definición de esquemas XML.

xs:anySimpleType se utiliza para definir un tipo necesario (por ejemplo, en una firma de función) paraindicar que cualquier tipo simple es aceptable. El tipo base de xs:anySimpleType es xs:anyType.

La conversión no está soportada a o desde xs:anySimpleType.

Formato léxico

xs:anySimpleType puede tener cualquier formato léxico.

xs:anyAtomicType:

El tipo de datos xs:anyAtomicType es el tipo base para todos tipos atómicos primitivos definidos en ellenguaje de definición de esquemas XML.

Formato léxico

El tipo de datos xs:anyAtomicType puede utilizarse para definir un tipo necesario (por ejemplo, en unafirma de función) para indicar que cualquiera de los tipos atómicos primitivos o xs:untypedAtomic esaceptable. El tipo base de xs:anyAtomicType es xs:anySimpleType.

xs:anyAtomicType puede tener cualquier formato léxico.

Tipos de datos para datos sin tipoLos tipos de datos xs:untyped y xs:untypedAtomic admiten datos sin tipo.

xs:untyped:

El tipo de datos xs:untyped actúa como una anotación de tipo especial para indicar tipos que unesquema XML no ha validado. El tipo de datos xs:untyped puede utilizarse (por ejemplo, en unasignatura de función) para definir un tipo necesario para indicar que sólo es aceptable un valor sin tipo.El tipo base de xs:untyped es xs:anyType.

148 IBM i: Programación SQL XML

Page 157: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Si un nodo de elemento está anotado como xs:untyped, todos sus nodos de elemento descendientestambién estarán notados como xs:sin. DB2 for i no conserva las anotaciones de tipo de las validacionesde esquema. Todos los elementos de un documento XML son de tipo xs:untyped.

xs:untypedAtomic:

El tipo de datos xs:untypedAtomic actúa como una anotación de tipo especial para indicar valoresatómicos que un esquema XML no ha validado.

Un atributo que tiene un tipo desconocido se representa en el modelo de datos mediante un nodo deatributo con el tipo xs:untypedAtomic. El tipo de datos xs:untypedAtomic puede utilizarse (por ejemplo,en una signatura de función) para definir un tipo necesario para indicar que sólo es aceptable un valoratómico sin tipo. El tipo base de xs:untypedAtomic es xs:anyAtomicType. No hay ningún constructor paraeste tipo. DB2 for i no conserva anotaciones de tipo en un documento XML, aunque el documento sehaya validado con un esquema XML. Todos los atributos serán de tipo xs:untypedAtomic en el modelo dedatos.

Formato léxico

xs:untypedAtomic puede tener cualquier formato léxico.

xs:stringEl tipo de datos xs:string representa series de caracteres en XML. Dado que xs:string es un tiposimple, no puede contener ningún hijo.

Formato léxico

El formato léxico de xs:string es una secuencia de caracteres que puede incluir cualquier carácter que seencuentre en el rango de caracteres permitidos para XML.

Constructor

Utilizar la sintaxis siguiente para crear una instancia de xs:string:

�� xs:string(valor) ��

valorEl valor que debe construirse. Si este valor es una secuencia vacía, se devuelve la secuencia vacía.

Si valor es ilegal para el tipo de datos de destino, la función del constructor devuelve un error.

Tipos de datos numéricosLos tipos de datos xs:decimal, xs:double y xs:integer admiten datos numéricos.

xs:decimal:

El tipo de datos xs:decimal representa un subconjunto de los números reales que pueden representaremediante números decimales.

Formato léxico

El formato léxico de xs:decimal es una secuencia de dígitos decimales (0 a 9) de longitud finita separadospor un punto como indicador decimal. Se permite un signo inicial opcional. Si el signo se omite, sepresupone un signo positivo (+). Los ceros iniciales y finales son opcionales. Si la parte fraccionaria escero, el punto y los ceros que le siguen pueden omitirse. Los números siguientes son ejemplos válidos deun decimal:

Programación SQL XML 149

Page 158: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v -1.23v 12678967.543233v +100000.00v 210.

Constructor

Utilice la sintaxis siguiente para crear una instancia de xs:decimal:

�� xs:decimal(valor) ��

valorEl valor que debe construirse. Si este valor es una secuencia vacía, se devuelve la secuencia vacía.

Si valor es ilegal para el tipo de datos de destino, la función del constructor devuelve un error.

xs:double:

El tipo de datos xs:double está soportado en DB2 XPath por el punto flotante decimal IEEE de 64 bits.

Formato léxico

El formato léxico de xs:double es una mantisa seguida opcionalmente del carácter E o e seguido de unexponente. El exponente debe ser un entero. La mantisa debe ser un número decimal. Lasrepresentaciones del exponente y la mantisa deben seguir las reglas de léxico de xs:integer yxs:decimal. Si se omiten E o e y el exponente que le sigue, se presupone un valor de exponente 0.

Los valores especiales de infinidad positiva, infinidad negativa y no numérico tienen las representacionesléxicas INF, -INF y NaN, respectivamente. Las representaciones léxicas de cero pueden tomar un signopositivo o negativo. Los literales siguientes son ejemplos válidos de un double:v -1E4v 1267.43233E12v 12.78e-2v 12v -0v 0v INF

Constructor

Utilizar la sintaxis siguiente para crear una instancia de xs:double:

�� xs:double(valor) ��

valorEl valor que debe construirse. Si este valor es una secuencia vacía, se devuelve la secuencia vacía.

Si valor es ilegal para el tipo de datos de destino, la función del constructor devuelve un error.

xs:integer:

El tipo de datos xs:integer representa un número decimal que no incluye un separador decimal al final.El tipo base de xs:integer es xs:decimal.

150 IBM i: Programación SQL XML

Page 159: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Formato léxico

El formato léxico de xs:integer es una secuencia de dígitos decimales (0 a 9) de longitud finita con unsigno inicial opcional. Si el signo se omite, se presupone un signo positivo (+). Los siguientes son todosellos ejemplos de números enteros válidos:v -1v 0v 12678967543233v +100000

Constructor

Utilice la sintaxis siguiente para crear una instancia de xs:integer:

�� xs:integer(valor) ��

valorEl valor que debe construirse. Si este valor es una secuencia vacía, se devuelve la secuencia vacía.

Si valor es ilegal para el tipo de datos de destino, la función del constructor devuelve un error.

Límites de rango para tipos numéricos:

DB2 XPath tiene límites de rango para tipos de datos numéricos.

La tabla siguiente muestra el límite de rango y el equivalente SQL para cada tipo de datos numéricos deXPath.

Tabla 49. Límites de rango para tipos numéricos

Tipo XML Rango XML DB2 Correlación de tipo SQL

xs:double 34 dígitos de precisión y un rango deexponentes de 0**-6143 a 10**+6144

DECFLOAT

xs:decimal Hasta 34 dígitos de precisión y unrango de 1-10**34 a 10**34 -1

DECIMALEs posible que se produzca recorteen precisión superior a 34 dígitos

xs:integer -9223372036854775808 a9223372036854775807

BIGINT

xs:booleanEl tipo de datos xs:boolean da soporte al concepto matemático de lógica de valor binario: true o false.

Formato léxico

El formato léxico del tipo de datos xs:boolean puede ser uno de los valores literales true, false, 1 o 0.

Constructor

Utilice la sintaxis siguiente para crear una instancia de xs:boolean:

�� xs:boolean(valor) ��

valorEl valor que debe construirse. Si este valor es una secuencia vacía, se devuelve la secuencia vacía.

Programación SQL XML 151

Page 160: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Si valor es ilegal para el tipo de datos de destino, la función del constructor devuelve un error.

Tipos de datos de fecha y horaLos tipos de datos xs:date, xs:time y xs:dateTime dan soporte a datos de fecha y hora.

xs:date:

El tipo de fecha xs:date representa un intervalo de exactamente un día que empieza en el primermomento de un día determinado.

Formato léxico

El formato léxico de xs:date es una secuencia de caracteres de longitud finita con el formato siguiente:aaaa–mm–ddzzzzzz. Las abreviaturas siguientes describen este formato:

aaaaNúmero de cuatro dígitos que representa el año.

El valor no puede empezar con un signo negativo (-) o un signo más (+).

0001 es la representación léxica del año 1 de la era común (también conocido como 1 AD).

El valor no puede ser 0000.

- Separadores entre partes de la fecha.

mm Número de dos dígitos que representa el mes.

dd Número de dos dígitos que representa el día.

zzzzzzOpcional. Si está presente, representa el huso horario.

Indicador de huso horario

El formato léxico del indicador de huso horario es una serie que incluye uno de los siguientes formatos:v Un signo positivo () o negativo (-) seguido de hh:mm, donde se utilizan las abreviaturas siguientes:

hh Número de dos dígitos (con ceros iniciales si es necesario) que representa las horas. El valor debeestar entre -14 y +14, ambos inclusive.

mm Número de dos dígitos que representa los minutos. El valor de la propiedad de minutos debe sercero cuando la propiedad de horas es igual a 14.

+ Indica que el instante de tiempo especificado está en un huso horario adelantado con respecto a lahora UTC en hh horas y mm minutos.

- Indica que el instante de tiempo especificado está en un huso horario retrasado con respecto a lahora UTC en hh horas y mm minutos.

v El literal Z, que representa la hora en UTC (Z representa la hora Zulu, que es equivalente a UTC).Especificar Z para el huso horario es equivalente a especificar +00:00 o -00:00.

Ejemplo

El formato siguiente indica el 10 de Octubre de 2009, Hora estándar del Este de los Estados Unidos:2009-10-10-05:00

Esta fecha representa la fecha UTC 2009-10-10T05:00:00Z.

xs:time:

El tipo de datos xs:time representa un instante de tiempo que se repite cada día.

152 IBM i: Programación SQL XML

Page 161: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Formato léxico

El formato léxico del tipo de datos xs:time es hh:mm:ss.sssssssssssszzzzzz.

El formato léxico del tipo de datos xs:time es hh:mm:ss.sssssszzzzzz.

Las abreviaturas siguientes describen este formato:

hh Número de dos dígitos (con ceros iniciales si es necesario) que representa las horas.

: Separador entre partes de la parte de hora.

mm Número de dos dígitos que representa los minutos.

ss Número de dos dígitos que representa los segundos enteros.

.ssssssssssssssssssOpcional. Si está presente, es un número de 1 a 12 dígitos que representa las fracciones de segundo.

zzzzzzOpcional. Si está presente, representa el huso horario.

Ejemplo

El formato siguiente, que incluye un indicador de huso horario opcional, representa la 1:20 p.m. Horaestándar del Este, que es cinco horas anterior a la Hora universal coordinada (UTC):13:20:00-05:00

xs:dateTime:

El tipo de datos xs:dateTime representa un instante en el tiempo.

El tipo de datos xs:dateTime tiene las propiedades siguientes:v añov mesv díav horasv minutosv segundosv huso horario (opcional)

Las propiedades de año, mes, día, horas y minutos se expresan como valores enteros. La propiedad desegundos se expresa como un valor decimal. La propiedad de huso horario se expresa como indicador dehuso horario.

Formato léxico

El formato léxico de xs:dateTime es una secuencia de caracteres de longitud finita con el formatosiguiente: aaaa–mm–ddThh:mm:ss.sssssssssssszzzzzz. Las abreviaturas siguientes describen este formato:

aaaaNúmero de cuatro dígitos que representa el año.

El valor no puede empezar con un signo negativo (-) o un signo más (+).

0001 es la representación léxica del año 1 de la era común (también conocido como 1 AD).

El valor no puede ser 0000.

- Los separadores entre partes de la parte de fecha.

mm Número de dos dígitos que representa el mes.

Programación SQL XML 153

Page 162: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

dd Número de dos dígitos que representa el día.

T Separador que indica que a continuación figura la hora del día.

hh Número de dos dígitos (con ceros iniciales si es necesario) que representa las horas. El valor debeestar entre -14 y +14, ambos inclusive.

: Separador entre partes de la parte de hora.

mm Número de dos dígitos que representa los minutos.

ss Número de dos dígitos que representa los segundos enteros.

.ssssssssssssOpcional. Si está presente, es un número de 1 a 12 dígitos que representa las fracciones de segundo.

zzzzzzOpcional. Si está presente, representa el huso horario. Si no se especifica un huso horario, dateTimeno tiene ningún huso horario; sin embargo, se utiliza un huso horario implícito de UTC (Horauniversal coordinada, también denominada Hora media de Greenwich) para las operaciones decomparación y aritméticas.

Cada parte del valor de fecha y hora que se expresa como valor numérico está limitada al valor máximodentro del intervalo determinado por la parte siguiente de valor más alto del valor de fecha y hora. Porejemplo, el valor de día no puede ser nunca 32 y no puede ser 29 para el mes 02 y el año 2002 (Febrerode 2002).

Indicador de huso horario

El formato léxico del indicador de huso horario es una serie que incluye uno de los siguientes formatos:v Un signo positivo () o negativo (-) seguido de hh:mm, donde se utilizan las abreviaturas siguientes:

hh Número de dos dígitos (con ceros iniciales si es necesario) que representa las horas. El valor debeestar entre -14 y +14, ambos inclusive.

mm Número de dos dígitos que representa los minutos. El valor de la propiedad de minutos debe sercero cuando la propiedad de horas es igual a 14.

+ Indica que el instante de tiempo especificado está en un huso horario adelantado con respecto a lahora UTC en hh horas y mm minutos.

- Indica que el instante de tiempo especificado está en un huso horario retrasado con respecto a lahora UTC en hh horas y mm minutos.

v El literal Z, que representa la hora en UTC (Z representa la hora Zulu, que es equivalente a UTC).Especificar Z para el huso horario es equivalente a especificar +00:00 o -00:00.

Ejemplo

El formato siguiente indica el mediodía del 10 de octubre de 2009, Hora estándar del Este en los EstadosUnidos:2009-10-10T12:00:00-05:00

Esta hora se expresa en UTC como 2009-10-10T17:00:00Z.

xs:duration:

El tipo de datos xs:duration representa una duración de tiempo que se expresa mediante los componentesde año, mes, día, hora, minutos y segundos del calendario gregoriano. xs:duration se deriva del tipo dedatos xs:anyAtomicType.

154 IBM i: Programación SQL XML

Page 163: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

El rango que puede representarse mediante este tipo de datos va de-P83333333333333Y3M11574074074DT1H46M39.999999999999S aP83333333333333Y3M11574074074DT1H46M39.999999999999S (o -999999999999999 meses y-999999999999999.999999999999 segundos a 999999999999999 meses y 999999999999999.999999999999).

El formato léxico de xs:duration es el formato ampliado ISO 8601 PnYnMnDTnHnMnS. Las abreviaturassiguientes describen el formato ampliado:

P El designador de duración.

nY n es un entero sin signo que representa el número de años.

nM n es un entero sin signo que representa el número de meses.

nD n es un entero sin signo que representa el número de días.

T Separador de fecha y hora.

nH n es un entero sin signo que representa el número de horas.

nM n es un entero sin signo que representa el número de minutos.

nS n es un entero sin signo que representa el número de segundos. Si aparece un punto decimal, debe irseguido de uno a doce dígitos que representan fracciones de segundo.

Por ejemplo, el formato siguiente indica una duración de 1 año, 2 meses, 3 días, 10 horas y 30 minutos:P1Y2M3DT10H30M

El formato siguiente indica una duración negativa de 120 días:-P120D

Un signo menos (-) precedente opcional indica una duración negativa. Si el signo se omite, se presuponeuna duración positiva.

La precisión reducida y las representaciones truncadas de este formato están permitidas, pero debencumplir con los siguientes requisitos:v Si el número de años, meses, días, horas, minutos o segundos de cualquier expresión es igual a cero, el

número y su designador correspondiente pueden omitirse. Sin embargo, al menos un número y sudesignador deben estar presentes.

v La parte de segundos puede tener una fracción decimal.v El designador T debe estar ausente si y sólo si todos los elementos de hora están ausentes.v El designador P debe estar siempre presente.

Por ejemplo, los formatos siguientes están permitidas:P1347YP1347MP1Y2MT2HP0Y1347MP0Y1347M0D

El formato P1Y2MT no está permitido porque no hay elementos de hora presentes. El formato P-1347M noestá permitido, pero sí el formato -P1347M.

DB2 almacena valores xs:duration en un formato normalizado. En el formato normalizado, loscomponentes de segundos y minutos son inferiores a 60, el componente de horas es inferior a 24 y elcomponentes de meses es inferior a 12. DB2 convierte cada múltiplo de 60 segundos en un minuto, cadamúltiplo de 60 minutos en una hora, cada múltiplo de 24 horas en un día y cada múltiplo de 12 meses enun año. Por ejemplo, la siguiente expresión XPath invoca una función de constructor que especifica unaduración de 2 meses, 63 días, 55 horas y 91 minutos:

Programación SQL XML 155

Page 164: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

xs:duration("P2M63DT55H91M")

DB2 convierte las 55 horas en 2 días y las 7 horas y 91 minutos en 1 hora y 31 minutos. La expresióndevuelve el valor de duración normalizado P2M65DT8H31M.

xs:dayTimeDuration:

El tipo de datos xs:dayTimeDuration representa una duración de tiempo que se expresa en componentesde días, horas, minutos y segundos. xs:dayTimeDuration se deriva del tipo de datos xs:duration.

El rango que puede representarse mediante este tipo de datos va de-P11574074073DT23H163M219.999999999999S a P11574074073DT23H163M219.999999999999S (o-999999999999999,999999999999 segundos a 999999999999999,999999999999 segundos).

El formato léxico de xs:dayTimeDuration es PnDTnHnMnS, que es un formato reducido del formato ISO8601. Las abreviaturas siguientes describen este formato:

P El designador de duración.

nD n es un entero sin signo que representa el número de días.

T Separador de fecha y hora.

nH n es un entero sin signo que representa el número de horas.

nM n es un entero sin signo que representa el número de minutos.

nS n es un entero sin signo que representa el número de segundos. Si aparece un punto decimal, debe irseguido de uno a doce dígitos que representan fracciones de segundo.

Por ejemplo, el formato siguiente indica una duración de 3 días, 10 horas y 30 minutos:P3DT10H30M

El formato siguiente indica una duración negativa de 120 días:-P120D

Un signo menos (-) precedente opcional indica una duración negativa. Si el signo se omite, se presuponeuna duración positiva.

La precisión reducida y las representaciones truncadas de este formato están permitidas, pero debencumplir con los siguientes requisitos:v Si el número de días, horas, minutos o segundos de cualquier expresión es igual a cero, el número y su

designador correspondiente pueden omitirse. Sin embargo, al menos un número y su designador debenestar presentes.

v La parte de segundos puede tener una fracción decimal.v El designador T debe estar ausente si y sólo si todos los elementos de hora están ausentes. El

designador P debe estar siempre presente.

Por ejemplo, los formatos siguientes están permitidas:P13DPT47HP3DT2H-PT35.89SP4DT251M

El formato P-134D no está permitido, pero sí el formato -P1347D.

DB2 almacena valores xs:dayTimeDuration en un formato normalizado. En el formato normalizado, loscomponentes de segundos y minutos son inferiores a 60, y el componente de horas es inferior a 24. DB2

156 IBM i: Programación SQL XML

Page 165: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

convierte cada múltiplo de 60 segundos en un minuto, cada múltiplo de 60 minutos en una hora y cadamúltiplo de 24 horas en un día. Por ejemplo, la siguiente expresión XPath invoca una función deconstructor especificando un valor dayTimeDuration de 63 días, 55 horas y 81 segundos:xs:dayTimeDuration("P63DT55H81S")

DB2 convierte las 55 horas en 2 días y 7 horas, y los 81 segundos en 1 minutos y 21 segundos. Laexpresión devuelve el valor normalizado de dayTimeDuration P65DT7H1M21S.

xs:yearMonthDuration:

El tipo de datos xs:yearMonthDuration representa una duración de tiempo que se expresa mediante loscomponentes de año y mes en el calendario gregoriano. xs:yearMonthDuration se deriva del tipo de datosxs:duration.

El rango que puede representarse mediante este tipo de datos va de -P83333333333333Y3M aP83333333333333Y3M (o -999999999999999 a 999999999999999 meses).

El formato léxico de xs:yearMonthDuration es PnYnM, que es una forma reducida del formato ISO 8601.Las abreviaturas siguientes describen este formato:

P El designador de duración.

nY n es un entero sin signo que representa el número de años.

nM n es un entero sin signo que representa el número de meses.

Un signo menos (-) precedente opcional indica una duración negativa. Si el signo se omite, se presuponeuna duración positiva.

Por ejemplo, el formato siguiente indica una duración de 1 año y 2 meses:P1Y2M

El formato siguiente indica una duración negativa de 13 meses:-P13M

La precisión reducida y las representaciones truncadas de este formato están permitidas, pero debencumplir con los siguientes requisitos:v El designador P debe estar siempre presente.v Si el número de años o meses de cualquier expresión es igual a cero, el número y su designador

correspondiente pueden omitirse. Sin embargo, al menos un número y su designador (Y o M) debenestar presentes.

Por ejemplo, los formatos siguientes están permitidas:P1347YP1347M

El formato P-1347M no está permitido, pero sí el formato -P1347M. El formato P24YM no está permitidoporque M debe tener ir precedido de un dígito. PY43M no está permitido porque Y debe tener ir precedidoal menos de un dígito.

DB2 almacena valores xs:yearMonthDuration en un formato normalizado. En el formato normalizado, elcomponente de meses es inferior a 12. DB2 convierte cada múltiplo de 12 meses en un año. Por ejemplo,la siguiente expresión XPath invoca una función de constructor que especifica un valoryearMonthDuration de 20 años y 30 meses:xs:yearMonthDuration("P20Y30M")

Programación SQL XML 157

Page 166: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

DB2 convierte los 30 meses en 2 años y 6 meses. La expresión devuelve el valor normalizado deyearMonthDuration P22Y6M.

Conversiones entre tipos de datos de esquema XMLPuede utilizar las funciones de constructor de tipos de datos para convertir un valor a un tipo de datosespecífico. Especifique el valor que desea convertir y el tipo al que desea convertirlo.

La tabla siguiente muestra los tipos compatibles para la conversión. Sólo puede convertir valores de lostipos de entrada de la lista a cada tipo de destino.

Tabla 50. Tipos compatibles para la conversión

Tipo de destino Tipo de origen Comentarios

xs:string Cualquier tipo v Si el tipo de origen es xs:boolean, el resultadoes ’true’ o ’false’.

v Si el tipo de origen es xs:integer, el resultadoes la representación léxica canónica del valor,tal como se define en la especificación delEsquema XML.

v Si el tipo de origen es xs:decimal:

– Si el valor no tiene dígitos significativosdespués del separador decimal, elseparador decimal y los ceros que le siguense suprimen y se aplican las normas para laconversión desde xs:integer.

– De lo contrario, el resultado es larepresentación léxica canónica del valor, talcomo se define en la especificación delEsquema XML.

v Si el tipo de origen es xs:double:

– Si .000001<=valor<=1000000, el valor seconvierte a xs:decimal y se aplican lasreglas de conversión de xs:decimal.

– Si valor=+0 o valor=-0, el resultado es '0'.

– De lo contrario, el resultado es larepresentación léxica canónica del valor, talcomo se define en la especificación delEsquema XML.

v Si el tipo de origen es xs:duration,xs:yearMonthDuration o xs:dayTimeDuration,el resultado es la representación léxicacanónica del valor.

v Si el tipo de origen es xs:date, xs:dateTime oxs:time, el resultado es la representación léxicadel valor, sin ajuste del huso horario. Si elvalor no tiene huso horario, el resultado notiene huso horario. Si el huso horario es +00:00o -00:00, el resultado tiene el huso horarioUTC "Z".

158 IBM i: Programación SQL XML

Page 167: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 50. Tipos compatibles para la conversión (continuación)

Tipo de destino Tipo de origen Comentarios

xs:boolean xs:untypedAtomic, xs:string,xs:boolean, xs:double, xs:decimal,xs:integer

v Si el tipo de origen es numérico, un valor de 0o NaN se convierte al tipo xs:boolean con unvalor false. Todos los demás valoresnuméricos se convierten al tipo xs:boolean conun valor true.

v Si el tipo de origen es xs:string oxs:untypedAtomic, el valor "true" y el valor"1" se convierten al valor xs:boolean true. Elvalor "false" y el valor "0" se convierten alvalor xs:boolean false. Ninguno de los demásvalores es válido, y da como resultado unerror.

xs:decimal Tipos numéricos,xs:untypedAtomic, xs:string,xs:boolean

Los valores de tipos numéricos se convierten aun valor que esté dentro del conjunto de valoresposibles de tipo xs:decimal y que esténuméricamente más cercano al origen. Si dosvalores son igualmente cercanos, se elige el máscercano a cero. El valor de origen no puede serINF, -INF, NaN o estar fuera del rango de tipoxs:decimal. Para los valores de tipo xs:boolean,true se convierte en 1.0 y false se convierte en0.0.

nxs:double Tipos numéricos,xs:untypedAtomic, xs:string,xs:boolean

Si el origen es de tipo xs:decimal o xs:integer, laconversión se realiza como xs:double(VO cast asxs:string), donde VO es el valor de origen. Si elorigen es de tipo xs:boolean, true se convierte enun valor 1.0E0 y false se convierte en un valor0.0E0.

xs:integer Tipos numéricos,xs:untypedAtomic, xs:string,xs:boolean

Si el tipo de origen es un tipo numérico que noes integer, el resultado es el valor de origen conla parte fraccionaria descartada. El origen nopuede estar fuera del rango del tipo xs:integer.Para los valores de tipo xs:boolean, true seconvierte en 1 y false se convierte en 0.

xs:date xs:dateTime, xs:untypedAtomic,xs:string

La parte de hora del valor de origen no se utilizaen la conversión.

xs:time xs:dateTime, xs:untypedAtomic,xs:string

La parte de la fecha del valor de origen no seutiliza en la conversión.

xs:dateTime xs:date, xs:untypedAtomic,xs:string

Si el tipo de origen es xs:date, la parte de horadel valor de destino es el primer momento deldía. El valor no se ajusta para el huso horario.

xs:duration xs:dayTimeDuration,xs:yearMonthDuration,xs:untypedAtomic, xs:string

v Si el tipo de origen es xs:dayTimeDuration, elvalor de destino tiene los mismoscomponentes de días, horas, minutos ysegundos que el valor de origen. Elcomponente de año y el componente de mesdel valor de destino son 0.

v Si el tipo de origen es xs:yearMonthDuration,el valor de destino tiene los mismoscomponentes de años y meses que el valor deorigen. Los componentes de días, horas,minutos y segundos son 0.

Programación SQL XML 159

Page 168: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 50. Tipos compatibles para la conversión (continuación)

Tipo de destino Tipo de origen Comentarios

xs:dayTimeDuration xs:duration, xs:untypedAtomic,xs:string

Una conversión de xs:duration axs:dayTimeDuration provoca la pérdida deinformación. Para evitar la pérdida deinformación, convierta el valor xs:duration a unvalor xs:yearMonthDuration y un valorxs:dayTimeDuration y trabaje con ambos valores.

xs:yearMonthDuration xs:duration, xs:untypedAtomic,xs:string

Una conversión de xs:duration axs:yearMonthDuration provoca la pérdida deinformación. Para evitar la pérdida deinformación, convierta el valor xs:duration a unvalor xs:yearMonthDuration y un valorxs:dayTimeDuration y trabaje con ambos valores.

Ejemplo

La siguiente expresión XPath devuelve órdenes de compra que contienen más de un elemento. La funciónde constructor xs:integer convierte el valor del elemento quantity en un entero. A continuación, ese enteropuede compararse con el entero 1.declare namespace ipo="http://www.example.com/IPO";/ipo:purchaseOrder[items/item/quantity/xs:integer(.) > 1]

Cuando un xs:untypedAtomic se compara con un entero, DB2 convierte ambos operandos al tipoxs:double para realizar la comparación numérica. La conversión garantiza que los valores se comparancomo valores de tipo xs:integer.

Expresiones y prólogos XPathEn DB2 XPath, una expresión XPath consta de un prólogo opcional seguido de una expresión. El prólogocontiene una serie de declaraciones que definen el entorno de proceso de la expresión. La expresión constade una expresión que define el resultado de la expresión XPath.

Sintaxis

Los diagramas siguientes muestran el formato general de una expresión XPath.

Expresión XPath

��prólogo

expresión ��

expresión:

expresión-primariaexpresión-lógicaexpresión-comparaciónexpresión-aritméticaexpresión-vía-acceso

prólogo:

160 IBM i: Programación SQL XML

Page 169: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

� declaración-espacio-nombresdeclaración-espacio-nombres-predeterminado

Ejemplo

El ejemplo siguiente muestra la estructura de una expresión típica en DB2 XPath. En este ejemplo, elprólogo contiene una declaración de espacio de nombres que enlaza el prefijo ipo con un URI. El cuerpode la expresión contiene una expresión que devuelve una fila para cada elemento ipo:purchaseOrder condocumentos XML almacenados en la columna XMLPO. Se utiliza un predicado para especificar que elatributo de nombre del nodo shipTo es "Jane" y el atributo de nombre del nodo billTo es "Jason".

PrólogosEl prólogo consta de una declaración que define el entorno de proceso de una expresión XPath. Unadeclaración del prólogo va seguida de un punto y coma (;). El prólogo es una parte opcional de laexpresión XPath.

El prólogo puede contener cero o más declaraciones de espacio de nombres y cero o una declaración deespacio de nombres predeterminado.

Declaraciones de espacio de nombres:

Una declaración de espacio de nombres es una declaración opcional del prólogo de la expresión XPath quedeclara un prefijo de espacio de nombres y asocia el prefijo con un URI de espacio de nombres.

La declaración añade el par prefijo-URI al conjunto de espacios de nombres conocidos estáticamente parala expresión. Los espacios de nombres conocidos estáticamente incluyen todos los espacios de nombres que seconocen durante el proceso estático de una expresión. La declaración de espacio de nombres está en elámbito de toda la expresión XPath en la que se declara. Varias declaraciones del mismo prefijo de espaciode nombres en el prólogo de la consulta generan un error.

Restricción: los prefijos xmlns y xml están reservados y no pueden especificarse como prefijo en unadeclaración de espacio de nombres.

Sintaxis

declaración-espacio-nombres

�� declare namespace prefijo = literalSerie ; ��

prefijoEspecifica un prefijo de espacio de nombres que se enlaza con el URI. El prefijo de espacio denombres se utiliza en los nombres calificados (QNames) para identificar el espacio de nombres de unelemento, atributo, tipo de datos o función.

literalSerieEspecifica un literal de serie que representa el URI al que se enlaza el prefijo. El valor del literal deserie debe ser un URI válido y no puede ser una serie de longitud cero.

SELECT X.* FROM T1, XMLTABLE (’declare namespace ipo="http://www.example.com/IPO";/ipo:purchaseOrder[shipTo/@name = "Jane" and billTo/@name = "Jason"]’PASSING T1.XMLPO) X;

Figura 1. Estructura de una expresión típica en DB2 XPath

Programación SQL XML 161

Page 170: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Puede alterar temporalmente los prefijos de espacio de nombres predeclarados especificando unadeclaración de espacio de nombres para dichos prefijos. Sin embargo, no puede alterartemporalmente el URI que está asociado con el prefijo xml.

El literal de serie no puede ser http://www.w3.org/XML/1998/namespace ni http://www.w3.org/2000/xmlns/.

Ejemplo

La declaración de espacio de nombres siguiente declara el prefijo de espacio de nombres ns1 y lo asociacon el URI de espacio de nombres http://posample.org:declare namespace ns1 = "http://posample.org";/ns1:purchaseOrder[shipTo/name = "Jane" and billTo/name = "Jason"]

Cuando se ejecuta la expresión del ejemplo, el prefijo de espacio de nombres ns1 se asocia con el URI deespacio de nombres http://posample.org. La instancia del documento de pedido de compra a la que laexpresión hace referencia es la instancia con el URI de espacio de nombres http://posample.org.

Declaraciones de espacio de nombres predeterminado:

Las declaraciones de espacio de nombres predeterminado son declaraciones opcionales del prólogo de unaexpresión XPath que especifican los espacios de nombres que deben utilizarse para QNames (nombrescalificados) sin prefijo.

Un prólogo de expresión XPath puede incluir una declaración de espacio de nombres de elementopredeterminado.

La declaración de espacio de nombres de elemento predeterminado especifica un URI de espacio denombres que se utiliza para los nombres de elemento sin prefijo. El prólogo de la expresión XPath sólopuede contener una declaración de espacio de nombres de elemento predeterminado. Esta declaraciónestá en el ámbito de toda la expresión en la que se declara. Si no se declara ningún espacio de nombresde elemento predeterminado, los nombres de elemento sin calificar no se encuentran en ningún espaciode nombres.

Sintaxis

declaración-espacio-nombres-predeterminado

�� declare default element namespace literalSerie ; ��

namespaceEspecifica un literal de serie que representa el URI del espacio de nombres. El literal de serie debe serun URI válido o una serie de longitud cero.

Si namespace es una serie de longitud cero, los nombres de elemento sin prefijo no están en ningúnespacio de nombres.

El literal de serie no puede ser http://www.w3.org/XML/1998/namespace ni http://www.w3.org/2000/xmlns/.

Ejemplo

La declaración siguiente especifica que el espacio de nombres predeterminado para los nombres deelemento es el espacio de nombres que está asociado con el URI http://posample.org.declare default element namespace "http://posample.org";

162 IBM i: Programación SQL XML

Page 171: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Cuando se ejecuta la consulta del ejemplo, todos los nodos de elemento de esta expresión(purchaseOrder, shipTo, billTo y name) se asocian con el URI de espacio de nombreshttp://posample.org.declare default element namespace "http://posample.org";/purchaseOrder[shipTo/name = "Jane" and billTo/name = "Jason"]

Cuando se ejecuta la expresión del ejemplo, el URI de espacio de nombres http://posample.org se asociacon todos los nombres de elemento sin prefijo de la expresión.

Evaluación y proceso de expresionesEn el proceso de expresiones se incluyen a menudo diversas operaciones. Estas operaciones incluyen laextracción de valores atómicos de nodos y la utilización de la promoción de tipo y la sustitución desubtipo para obtener valores de un tipo esperado.

Atomización:

La atomización es el proceso de convertir una secuencia de elementos en una secuencia de valoresatómicos. Las expresiones utilizan la atomización siempre que se requiere una secuencia de valoresatómicos.

Cada elemento de una secuencia se convierte en un valor atómico aplicando las reglas siguientes:v Si el elemento es un valor atómico, se devuelve el valor atómico.v Si el elemento es un nodo, se devuelve su valor con tipo. El valor con tipo de un nodo es una secuencia

de cero o más valores atómicos que se pueden extraer del nodo. Si el nodo no tiene ningún valor contipo, se devuelve un error. Si un documento XML se valida con un esquema, DB2 for i no mantiene laanotación de tipo para cada nodo. Los datos siempre se almacenan como sin tipo. El valor con tipo deun elemento o atributo sin tipo es el valor de serie como instancia de xs:untypedAtomic.

La atomización implícita de una secuencia produce el mismo resultado que invocar la función fn:dataexplícitamente en una secuencia.

Por ejemplo, la secuencia siguiente contiene una combinación de nodos y valores atómicos:("Algún texto", <anElement>Más texto</anElement>, 1001)

la aplicación de la atomización a esta secuencia genera la siguiente secuencia de valores atómicos:("Algún texto", "Más texto", 1001)

Las siguientes expresiones XPath utilizan la atomización para convertir elementos en valor atómicos:v Expresiones aritméticasv Expresiones de comparaciónv Llamadas de función con argumentos cuyos tipos esperados son atómicos

Promoción de tipo:

La promoción de tipo es un proceso que convierte un valor atómico de su tipo original al tipo esperado poruna expresión. XPath utiliza la promoción de tipo durante la evaluación de llamadas y operadores defunción que aceptan operandos numéricos o de serie.

XPath permite la promoción de tipo y la sustitución de subtipo. La promoción de tipo y la sustitución desubtipo difieren en los siguientes aspectos:v En la promoción de tipo, el valor atómico se convierte realmente desde su tipo original al tipo

esperado por una expresión.v En la sustitución de subtipo, una expresión que espera un tipo específico puede invocarse con un valor

derivado de ese tipo. Sin embargo, el valor conserva su tipo original.

Programación SQL XML 163

Page 172: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Promoción de tipo numérico:Un valor de tipo xs:decimal (o de cualquier otro tipo derivado por restricción de xs:decimal)puede promocionarse a xs:double. El resultado de esta promoción se crea convirtiendo el valororiginal al tipo necesario.

En el ejemplo siguiente, el valor xs:double 13.54e-2 se añade al valor xs:decimal 100. El xs:decimalse promociona a xs:double para realizar la aritmética y se devuelve un resultado con un tipo dexs:double:xs:double(13.54e-2) + xs:decimal(100)

Sustitución de subtipo:

La sustitución de subtipo es el uso de un valor cuyo tipo se deriva de un tipo esperado.

La sustitución de subtipo no cambia el tipo real de un valor. Por ejemplo, si se utiliza un valor xs:integerdonde se espera un valor xs:decimal, el valor conserva su tipo como xs:integer.

La sustitución de subtipo se utiliza siempre que un valor derivado de un tipo esperado se pasa a unaexpresión.

En el ejemplo siguiente, se sustituye un valor xs:dayTimeDuration para un valor xs:duration esperadopor la función fn:hours-from-duration.fn:hours-from-duration(xs:dayTimeDuration("PT2H"))

Expresiones primariasUna expresión primaria contiene uno de los siguientes tipos de elementos: literal, referencia de variable,expresión entre paréntesis, expresión de elemento de contexto o llamada de función.

Sintaxis

expresión-primaria:

literalreferencia-variableexpresión-entre-paréntesisexpresión-elemento-contextollamada-función

Literales:

DB2 XPath admite dos tipos de literales: literales numéricos y literales de serie.

Un literal numérico es un valor atómico de tipo xs:integer, xs:decimal o xs:double. Un literal numéricoque no contiene ningún separador decimal (.) ni ningún carácter e o E es un valor atómico de tipoxs:integer. Un literal numérico que contiene un separador decimal (.), pero no un carácter e o E, es unvalor atómico de tipo xs:decimal. Un literal numérico que contiene un carácter e o E es un valor atómicode tipo xs:double. Los valores de los literales numéricos se interpretan según las normas del esquemaXML.

Un literal de serie es un valor atómico de tipo xs:string que está encerrado entre apóstrofos o comillas dedelimitación. Los literales de serie pueden incluir referencias de entidad y referencias de caracterespredefinidas.

Para incluir un apóstrofo dentro de un literal de serie que está delimitada por apóstrofos, especifique dosapóstrofos adyacentes. De forma similar, para incluir comillas dentro de un literal de serie que estádelimitada por comillas, especifique dos símbolos de comillas adyacentes.

164 IBM i: Programación SQL XML

Page 173: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Si un literal de serie se utiliza en una expresión XPath dentro del valor de un atributo XML, los caracteresutilizados para delimitar el literal deben ser diferentes de los caracteres utilizados para delimitar elatributo.

Ejemplos

Ejemplo de expresiones XPath con literales numéricos:’7635’’8735.98834’’93948.87E+77’

Ejemplo de expresión XPath que contiene un literal de serie con comillas dobles incorporadas:SELECT X.* FROM X1,

XMLTABLE(’$inp/purchaseOrder[contains(., "string literal double-quote "" in the middle")]’PASSING X1.XMLPO as "inp") X;

Referencias de entidades predefinidas:

Una referencia de entidad predefinida es una secuencia corta de caracteres que representa un carácter quetiene algún significado sintáctico en DB2 XPath.

Una referencia de entidad predefinida empieza con un carácter de ampersand (&) y termina con unpunto y coma (;). Cuando se procesa un literal de serie, cada referencia de entidad predefinida sesustituye por el carácter que representa. La tabla siguiente indica las referencias de entidades predefinidasque DB2 XPath reconoce:

Tabla 51. Referencias de entidades predefinidas en DB2 XPath

Referencia de entidad Carácter representado

&lt; <

&gt; >

&amp; &

&quot; "

&apos; '

Referencias de caracteres:

Una referencia de carácter es una referencia de estilo XML a un carácter Unicode identificado por su puntode código decimal o hexadecimal.

Una referencia de carácter empieza por &#x o &# y termina con un punto y coma (;). Si la referencia decarácter empieza por &#x, los dígitos y letras hasta el punto y coma (;) de terminación proporcionan unarepresentación hexadecimal del punto de código del carácter en ISO/IEC 10646. Si la referencia decarácter empieza por &#, los dígitos hasta el punto y coma (;) de terminación proporcionan unarepresentación decimal del punto de código del carácter.

Ejemplo

La referencia de carácter &#8364; representa el símbolo de Euro (€).

Referencias de variable en DB2 XPath:

Una referencia de variable es un QName que va precedido por un signo de dólar ($). Cuando se evalúauna expresión XPath, cada referencia de variable se resuelve en el valor de la expresión que se enlaza a lavariable.

Programación SQL XML 165

Page 174: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Cada referencia de variable debe coincidir con un nombre de las variables en ámbito de la expresiónXPath. Las variables en ámbito están enlazadas desde el contexto de SQL que invoca la expresión XPath,como por ejemplo las variables definidas en la expresión de argumento de fila de XMLTABLE.

Dos referencias de variable son equivalentes si sus nombres locales son iguales y sus prefijos de espaciode nombres están enlazados al mismo URI de espacio de nombres en los espacios de nombres en ámbito.Una referencia de variable sin prefijo no está en ningún espacio de nombres. DB2 for i no permiteespecificar un prefijo de espacio de nombres para un nombre de variable.

Ejemplos

En el ejemplo siguiente, la función XMLTABLE enlaza el valor de la variable de lenguaje principal :IHVcon $PARTNUMBER, y el valor de la columna C1 con $QTY.SELECT X.* FROM T1, XMLTABLE(’//item[@partNum = $PARTNUMBER and quantity=$QTY]’

PASSING T1.XMLPO, :IHV AS PARTNUMBER, T1.C1 AS QTY) X;

Expresión entre paréntesis:

Pueden utilizarse paréntesis para imponer un orden de evaluación concreto en expresiones que contienenvarios operadores.

Utilice una expresión entre paréntesis para especificar explícitamente el orden de las operaciones en unaexpresión aritmética compleja.

Los paréntesis vacíos se utilizan para indicar una secuencia vacía.

Sintaxis

expresión-entre-paréntesis:

( )expresión

Ejemplos

En el ejemplo siguiente, las expresiones entre paréntesis 5+5 y 6+4 se evalúan en primer lugar.((5+5) * (6+4)) div 5

El resultado es 20.

Expresiones de elemento de contexto:

Una expresión de elemento de contexto está formada por un solo punto (.). Una expresión de elementode contexto se evalúa como el elemento que se está procesando actualmente, conocido como elemento decontexto. El elemento de contexto puede ser un nodo o un valor atómico.

Ejemplo

El ejemplo siguiente contiene una expresión de elemento de contexto que identifica Pantalones de nylonen el documento de productos (products):declare namespace ipo="http://www.example.com/IPO";/ipo:products/product/name[. = "Pantalones de nylon"]

166 IBM i: Programación SQL XML

Page 175: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Llamadas de función:

DB2 XPath da soporte a las llamadas a funciones incorporadas XPath.

Las funciones incorporadas XPath se encuentran en el espacio de nombres http://www.w3.org/2003/11/xpath-functions. Si el nombre de función de la llamada a la función no tiene prefijo de espacio denombres, se considera que la función se encuentra en el espacio de nombres de función predeterminado.

DB2 XPath utiliza el proceso siguiente para evaluar las funciones:1. DB2 XPath evalúa cada expresión que se pasa como argumento en la llamada a la función y devuelve

un valor para cada expresión.2. El valor devuelto para cada argumento se convierte al tipo de datos que se espera para ese

argumento. Cuando el tipo esperado es una secuencia de cero o más tipos atómicos, DB2 XPathutiliza las reglas siguientes para convertir el valor a su tipo esperado:a. El valor dado se atomiza en una secuencia de valores atómicos.b. Cada elemento de la secuencia atómica que es de tipo xs:untypedAtomic se convierte al tipo

atómico esperado. Para las funciones incorporadas donde el tipo esperado se especifica comonumeric, los argumentos de tipo xs:untypedAtomic se convierte a xs:double.

c. La promoción de tipo numérico se aplica a cualquier elemento numérico de la secuencia atómicaque puede promocionarse al tipo atómico esperado a través de la promoción de tipo numérico.Los elementos numéricos incluyen elementos de tipo xs:integer, xs:decimal o xs:double.

3. La función se evalúa utilizando los valores convertidos de sus argumentos. El resultado de la llamadaa función es una instancia del tipo de retorno declarado de la función o un error.

Ejemplo

El ejemplo siguiente recupera los tres primeros caracteres del atributo pid de un documento de producto:declare namespace pos="http://posample.org";

fn:substring(/pos:product/@pid, 1, 3)

Expresiones de vía de accesoLas expresiones de vía de acceso localizan nodos dentro de un árbol XML. Las expresiones de vía de accesoen DB2 XPath se basan en la sintaxis de XPath 2.0.

Una expresión de vía de acceso consta de una serie de uno o varios pasos que están separados por uncarácter de barra inclinada (/) o dos caracteres de barra inclinada (//). La expresión de vía de accesopuede empezar con un carácter de barra inclinada (/), dos caracteres de barra inclinada (//) o un paso.

Un carácter de barra inclinada (/) se utiliza para separar los pasos individuales. Dos caracteres de barrainclinada (//) en una expresión de vía de acceso se expanden como /descendant-or-self::node()/, lo quedeja una secuencia de pasos separados por un carácter de barra inclinada (/). Cada paso genera unasecuencia de elementos.

Los pasos de una expresión de vía de acceso se evalúan de izquierda a derecha. La secuencia deelementos generados por un paso se utilizan como nodos de contexto para el paso que sigue. Porejemplo, en la expresión description/name, el primer paso genera una secuencia de nodos que incluyetodos los elementos description. El paso final evalúa el paso name una vez para cada elementodescription de la secuencia. Cada vez que se evalúa un paso name, lo hace con un foco diferente, hastaque todos los elementos description se han evaluado. Las secuencias resultantes de cada evaluación delpaso se fusionan en el orden de documento, y los nodos duplicados se eliminan en función de laidentidad de nodo.

Aunque el resultado de una expresión de paso XPath se determina evaluando los pasos y predicados deizquierda a derecha, DB2 puede realizar la evaluación en un orden más eficaz. En algunos casos, estopuede cambiar los errores que se indican.

Programación SQL XML 167

Page 176: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Una barra inclinada (/) al principio de una expresión de vía de acceso significa que la vía de acceso debeempezar en el nodo raíz del árbol que contiene el nodo de contexto. Ese nodo raíz debe ser un nodo dedocumento.

Recomendación: dado que el carácter de barra inclinada puede utilizarse como operador y comooperando, utilice paréntesis para clarificar el significado del carácter barra inclinada cuando lo utilicecomo primer carácter de un operador. Por ejemplo, para especificar una expresión de vía de acceso vacíacomo operando izquierdo de una operación de multiplicación, utilice (/)*5 en lugar de /*5. La segundaexpresión provocará un error. Dado que las expresiones de vía de acceso tienen la prioridad más alta,DB2 interpreta esta expresión como una expresión de vía de acceso con un comodín para una prueba denombre (/*) seguido por el símbolo 5.

Dos caracteres de barra inclinada (//) al principio de una expresión de vía de acceso establecen unasecuencia de nodos inicial que contiene la raíz del árbol en el que se encuentra el nodo de contexto ytodos los nodos descendientes de esta raíz. Esta secuencia de nodos se utiliza como entrada para lospasos subsiguientes de la expresión de vía de acceso. Ese nodo raíz debe ser un nodo de documento.

El valor de la expresión de vía de acceso es la secuencia combinada de elementos que resulta del últimopaso de la vía de acceso. Este valor es una secuencia de nodos o un valor atómico. Una expresión de víade acceso que devuelve una combinación de nodos y valores atómicos genera un error.

Un paso consiste en un paso de eje o una expresión de filtro.

Sintaxis

expresión-vía-acceso:

paso///

/ paso// paso

paso:

expresión-filtropaso-eje

Ejemplo

Utilizar una expresión de vía de acceso para determinar qué stocks tienen al menos una oferta cuyoprecio es superior al de alguna oferta sobre ese stock.//stock[bid/xs:double(price) > offer/price]/@stock_id

Pasos de eje:

Un paso de eje consta de tres partes: un eje opcional, una prueba de nodo y cero o más predicados.

La prueba de nodo especifica los criterios utilizado para seleccionar nodos. Los predicados filtran lasecuencia devuelta por el paso de eje.

El resultado de un paso de eje siempre es una secuencia de cero o más nodos y esos nodos se devuelvenpor orden de documento. Un paso de eje puede ser un paso directo, que se inicia en el nodo de contexto y

168 IBM i: Programación SQL XML

Page 177: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

se mueve hacia abajo por el árbol XML, o un paso inverso, que se inicia en el nodo de contexto y sedesplaza hacia arriba por el árbol XML. Si el elemento de contexto no es un nodo, la expresión da comoresultado un error de tipo.

La sintaxis no abreviada de un paso de eje consta de un nombre de eje y una prueba de nodo separadospor dos puntos dobles. La sintaxis de una expresión de eje se puede abreviar omitiendo el eje yutilizando notaciones abreviadas.

Sintaxis

paso-eje:

eje prueba-nombre-xmlprueba-tipo-xml lista-predicados

eje:

hijo ::

@atributo ::descendiente ::auto ::descendiente-o-auto ::padre ::

prueba-nombre-xml:

nombre-calificado-xmlcomodín-xml

comodín-xml:

*prefijo-en-xml:**:ncame-xml

prueba-tipo-xml:

document-node ( )element ( nombre )

*element ( )

nombre*

attribute ( )nombre*

processing instruction ( ncname-xml )serie-literal-instrucción-proceso

comment ( )text ( )node ( )

Programación SQL XML 169

Page 178: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

lista-predicados:

� [ expresión ]

Ejemplo

En el ejemplo siguiente, child es el nombre del eje y price es el nombre de los nodos de elemento quedeben seleccionarse en este eje.child::price

El paso de eje de este ejemplo selecciona todos los elementos price que son hijos del nodo de contexto.

Ejes:

Un eje es una parte opcional de un paso de eje que especifica un sentido de movimiento a través de undocumento XML.

La Tabla 52 describe los ejes que están soportados en DB2 XPath.

Tabla 52. Ejes soportados en DB2 XPath

Eje Descripción Notas

hijo Devuelve los hijos del nodo de contexto. Este esel eje predeterminado.

Los nodos de documento y los nodos deelemento son los únicos nodos que tienen hijos.Si el nodo de contexto es cualquier otro tipo denodo o si el nodo de contexto es un documentovacío o nodo de elemento, el eje hijo es unasecuencia vacía. Los hijos de un nodo dedocumento o de elemento puede ser nodos deelemento, de instrucción de proceso, decomentario o de texto. Los nodos de atributo yde documento nunca pueden aparecer comohijos.

descendiente Devuelve los descendientes del nodo decontexto (los hijos, los hijos de los hijos, y asísucesivamente).

atributo Devuelve los atributos del nodo de contexto. Este eje está vacío si el nodo de contexto no esun nodo de elemento.

auto Devuelve sólo el nodo de contexto.

descendiente-o-auto

Devuelve el nodo de contexto y losdescendientes del nodo de contexto.

padre Devuelve el padre del nodo de contexto, o unasecuencia vacía si el nodo de contexto no tienepadre.

Un nodo de elemento puede ser el padre de unnodo de atributo, aunque un nodo de atributonunca es hijo de un nodo de elemento.

DB2 XPath no da soporte a los ejes adicionales definidos por la característica de eje completo del estándarW3.

Un eje puede ser directo o inverso. Un eje directo contiene el nodo de contexto y los nodos situadosdespués del nodo de contexto en el orden de documento. Un eje inverso contiene el nodo de contexto y

170 IBM i: Programación SQL XML

Page 179: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

los nodos situados antes del nodo de contexto en el orden de documento. En DB2 XPath, los ejes directosson: hijo, descendiente, atributo, auto y descendiente-o-auto. El único eje inverso soportado es el ejepadre.

Cuando un paso de eje selecciona una secuencia de nodos, se asigna a cada nodo una posición decontexto que corresponde a su posición en la secuencia. Si el eje es directo, las posiciones de contexto seasignan a los nodos en el orden de documento, empezando por el 1. Si el eje es inverso, las posiciones decontexto se asignan a los nodos en orden de documento inverso, empezando por el 1.

Pruebas de nodo:

Una prueba de nodo es una condición que debe cumplirse para cada nodo seleccionado por un paso de eje.La prueba de nodo puede expresarse como prueba de nombre o como prueba de tipo. Una prueba denombre selecciona nodos basándose en el nombre del nodo. Una prueba de tipo selecciona nodos basándoseen el tipo de nodo.

Pruebas de nombre

Una prueba de nombre consta de un QName o un comodín. Cuando se especifica una prueba de nombreen un paso de eje, el paso selecciona los nodos del eje especificado que coinciden con el QName ocomodín. Si la prueba de nombre se especifica en el eje de atributo, el paso selecciona los atributos quecoinciden con la prueba de nombre. En todos los demás ejes, el paso selecciona los elementos quecoinciden con la prueba de nombre. Para que los QNames coincidan, el QName ampliado del nodo debeser igual (en función del punto de código) al Qname ampliado especificado en la prueba de nombre. DosQNames ampliados son iguales si sus URI de espacio de nombres son iguales y sus nombres locales soniguales (aunque sus prefijos de espacio de nombres no sean iguales).

Importante: Cualquier prefijo especificado en una prueba de nombre debe corresponder a uno de losespacios de nombres conocidos estáticamente para la expresión. En las pruebas de nombre realizadas enlos ejes de atributo, los QNames sin prefijo no tienen URI de espacio de nombres. En las pruebas denombre realizadas en todos los demás ejes, los QNames sin prefijo tienen el URI de espacio de nombresdel espacio de nombres de elemento predeterminado.

La Tabla 53 describe las pruebas de nombre soportadas en DB2 XPath.

Tabla 53. Pruebas de nombre soportadas en DB2 XPath

Prueba Descripción Ejemplos

QName Coincide con cualquier nodo (del ejeespecificado) cuyo QName es igual al QNameespecificado. Si el eje es un eje de atributo, estaprueba coincide con los nodos de atributo queson iguales al QName especificado. En todoslos demás ejes, esta prueba coincide con losnodos de elemento que son iguales al QNameespecificado.

En la expresión child::para, la prueba denombre para selecciona todos los elementospara del eje de hijo.

* Coincide con todos los nodos del ejeespecificado. Si el eje es un eje de atributo, estaprueba coincide con todos los nodos deatributo. En todos los demás ejes, esta pruebacoincide con todos los nodos de elemento.

En la expresión, child::*, la prueba de nombre* coincide con todos los elementos del eje dehijo.

Programación SQL XML 171

Page 180: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Pruebas de tipo

Cuando se especifica una prueba de tipo en un paso de eje, el paso selecciona sólo los nodos del ejeespecificado que coinciden con la prueba de tipo. La Tabla 54 describe las pruebas de tipo soportadas enDB2 XPath.

Tabla 54. Pruebas de tipo soportadas en DB2 XPath

Prueba Descripción Ejemplos

node() Coincide con cualquier nodo del ejeespecificado.

En la expresión child::node(), laprueba de tipo node() selecciona losnodos del eje de hijo.

text() Coincide con cualquier nodo de textodel eje especificado.

En la expresión child::text(), laprueba de tipo text() selecciona losnodos de texto del eje de hijo.

comment() Coincide con cualquier nodo decomentario del eje especificado.

En la expresión child::comment(), laprueba de tipo comment() selecciona losnodos de comentario del eje de hijo.

processing-instruction(NCName) Coincide con cualquier nodo deinstrucción de proceso (del ejeespecificado) cuyo nombre(denominado "PITarget" en XML)coincide con el NCName que se haespecificado en esta prueba de nombre.

En la expresión child::processing-instruction( xml-stylesheet), laprueba de tipo processing-instruction( xml-stylesheet)selecciona los nodos de instrucción deproceso del eje de hijo cuyo PITarget esxml-stylesheet.

processing-instruction(LiteralSerie) Coincide con cualquier nodo deinstrucción de proceso (del ejeespecificado) cuyo nombre coincidecon el literal de serie especificado enesta prueba.

Esta prueba de nodo proporcionacompatibilidad hacia atrás con XPath1.0.

En la expresión child::processing-instruction("xml-stylesheet"), laprueba de tipo processing-instruction("xml-stylesheet")selecciona los nodos de instrucción deproceso del eje de hijo cuyo PITarget esxml-stylesheet.

element() Coincide con cualquier nodo deelemento del eje especificado.

En la expresión child::element(), laprueba de tipo element() selecciona losnodos de elemento del eje de hijo.

element(QName) Coincide con cualquier nodo deelemento (del eje especificado) cuyonombre coincida con el nombrecalificado que se ha especificado enesta prueba.

En la expresiónchild::element("price"), la prueba detipo element("price") selecciona losnodos de elemento del eje de hijo cuyonombre es price.

element(*) Coincide con cualquier nodo deelemento del eje especificado.

En la expresión child::element(*), laprueba de tipo element(*) seleccionacualquier nodo de elemento del eje dehijo.

attribute() Coincide con cualquier nodo deatributo del eje especificado.

En la expresión child::attribute(), laprueba de tipo attribute() seleccionalos nodos de atributo del eje de hijo.

attribute(QName) Coincide con cualquier nodo deatributo (del eje especificado) cuyonombre coincide con el nombrecalificado que se ha especificado enesta prueba.

En la expresiónchild::attribute("price"), la pruebade tipo attribute("price") seleccionalos nodos de atributo del eje de hijocuyo nombre es price.

172 IBM i: Programación SQL XML

Page 181: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 54. Pruebas de tipo soportadas en DB2 XPath (continuación)

Prueba Descripción Ejemplos

attribute(*) Coincide con cualquier nodo deatributo del eje especificado.

En la expresión child::attribute(*),la prueba de tipo attribute(*)selecciona los nodos de atributo del ejede hijo.

document-node() Coincide con cualquier nodo dedocumento del eje especificado.

En la expresión self::document-node(), la prueba de tipodocument-node() selecciona los nodosde documento del eje auto.

document-node(element(QName)) Coincide con cualquier nodo dedocumento del eje especificado quetenga sólo un nodo de elemento.

En la expresión self::document-node(element("price")), la prueba detipo document-node(element("price"))selecciona los nodos de documento deleje auto que tienen un único elementoraíz cuyo nombre es price.

document-node(element(*)) Coincide con cualquier nodo dedocumento del eje especificado quetenga nodos nodo de elemento.

En la expresión self::document-node(element(*)), la prueba de tipodocument-node(element(*)) seleccionalos nodos de documento del eje autoque tienen nodos de elemento.

Predicados:

Un predicado consta de una expresión, denominada expresión de predicado, especificada entre corchetes([]). Un predicado filtra una secuencia conservando algunos elementos y descartando otros.

La expresión de predicado se evalúa una vez para cada elemento de la secuencia. El resultado de laexpresión de predicado es un valor xs:boolean denominado valor de certeza de predicado. Los elementoscuyo valor de certeza de predicado es true se conservan, y aquellos cuyo valor de certeza de predicadoes false se eliminan.

El valor de la expresión de predicado puede ser un valor numérico siempre y cuando su tipo estático seaun singleton numérico. Cuando el tipo estático de la expresión de predicado es un singleton numérico, elvalor de certeza de predicado es true si la posición del elemento de contexto dentro de la secuencia deelementos que se evalúan coincide con el singleton numérico. Dicho de otro modo: child::employee/child::address[2] es equivalente a child::employee/child::address[fn:position() = 2] y devuelve lasegunda dirección bajo employee. Si la expresión de predicado es un número que no puede determinarsecomo un singleton al analizar la expresión, se indicará un error de falta de soporte.

Para todos los demás tipos de datos, el valor de certeza de predicado es el valor booleano efectivo de laexpresión de predicado. El valor booleano efectivo es false si la expresión de predicado se evalúa comouna secuencia vacía o false. De lo contrario, el valor booleano efectivo es true.

Si un predicado se utiliza para filtrar un valor atómico o una llamada de función, puede indicarse unerror de falta de soporte.

Ejemplos

Los ejemplos siguientes son pasos de eje que incluyen predicados:v descendant::phone[attribute::type = "work"] selecciona todos los descendientes del nodo de

contexto que son elementos denominados phone y cuyo atributo type tiene el valor "work".v child::address[prov-state][pcode-zip] selecciona todos los hijos de address del nodo de contexto

que tienen un elemento hijo prov-state y un elemento hijo pcode-zip.

Programación SQL XML 173

Page 182: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Sintaxis abreviada para expresiones de vía de acceso:

DB2 XPath proporciona una sintaxis abreviada para expresar los ejes en las expresiones de vía de acceso.

La Tabla 55 describe las abreviaturas permitidas en expresiones de vía de acceso.

Tabla 55. Sintaxis abreviada para expresiones de vía de acceso

Sintaxis abreviada Descripción

ningún eje especificado Forma abreviada para child::, excepto cuando el paso de eje especificaattribute() para la prueba de nodo. Cuando el paso de eje especifica unaprueba de atributo, un eje omitido es la forma abreviada para attribute::.

@ Forma abreviada para attribute:: .

// Forma abreviada para /descendant-or-self::node()/, excepto cuando estaabreviatura aparece al principio de la expresión de vía de acceso.

Cuando esta abreviatura aparece al principio de la expresión de vía de acceso,el paso de eje selecciona una secuencia de nodos inicial que contiene la raízdel árbol en el que se encuentra el nodo de contexto, además de todos losnodos que son descendientes de esta raíz. Esta expresión genera un error si elnodo raíz no es un nodo de documento.

.. Forma abreviada para parent::node().

Ejemplos de sintaxis abreviada y sin abreviar

La Tabla 56 proporciona ejemplos de sintaxis abreviada y sin abreviar.

Tabla 56. Comparación de sintaxis sin abreviar y abreviada

Sintaxis sin abreviar Sintaxis abreviada Resultado

child::para para Selecciona los elementos paraque son hijos del nodo decontexto.

child::* * Selecciona todos loselementos que son hijos delnodo de contexto.

child::text() text() Selecciona todos los nodos detexto que son hijos del nodode contexto.

child::node() node() Selecciona todos los hijos delnodo de contexto. Estaexpresión no devuelve nodosde atributo, porque losatributos no son hijos de unnodo.

attribute::name @name Selecciona el atributo name delnodo de contexto

attribute::* @* Selecciona todos los atributosdel nodo de contexto.

child::para[attribute::type="warning"] para[@type="warning"] Selecciona todos los hijospara del nodo de contextoque tienen un atributo de tipocon el valor warning.

child::chapter[child::title="Introduction"] chapter[title="Introduction"] Selecciona los hijos chapterdel nodo de contexto quetienen uno o más hijos titlecuyo valor de tipo es igual ala serie Introduction.

174 IBM i: Programación SQL XML

Page 183: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 56. Comparación de sintaxis sin abreviar y abreviada (continuación)

Sintaxis sin abreviar Sintaxis abreviada Resultado

child::chapter[child::title] chapter[title] Selecciona los hijos chapterdel nodo de contexto quetiene uno o más hijos title.

Expresiones de filtroUna expresión de filtro consta de una expresión primaria que va seguida de cero o más predicados. Lospredicados, si están presentes, filtran el resultado de la expresión primaria.

El resultado de una expresión de filtro consta de todos los elementos devueltos por la expresión primariapara los que todos los predicados son verdaderos. Si no se especifican predicados, el resultado es el de laexpresión primaria. Este resultado puede contener nodos, valores atómicos o una combinación de nodosy valores atómicos. El orden de los elementos devueltos por una expresión de filtro es el mismo que suorden en el resultado de la expresión primaria. Las posiciones de contexto se asignan a los elementosbasándose en su posición ordinal en la secuencia de resultados. La primera posición de contexto es 1.

Sintaxis

expresión-filtro

�� expresión-primarialista-predicados

��

Ejemplos

El ejemplo siguiente utiliza una expresión de filtro que devuelve el valor de $x si hay un elementocustomerinfo en cualquier lugar del documento especificado por $x:declare default element namespace "http://posample.org";

$x[.//customerinfo]

Expresiones aritméticasLas expresiones aritméticas realizan operaciones que implican suma, resta, multiplicación, división ymódulo.

la tabla siguiente describe los operadores aritméticos y los lista por orden de prioridad de operador, demás alta a más baja. Los operadores unarios tienen una prioridad mayor que los operadores binarios, amenos que se utilicen paréntesis para forzar la evaluación del operador binario.

Tabla 57. Operadores aritméticos de DB2 XPath

Operador Finalidad Asociatividad

-(unary),+(unary)

niega el valor del operando, mantiene el valordel operando

derecha a izquierda

*, div, idiv, mod multiplicación, división, división entera, módulo izquierda a derecha

+, - adición, sustracción izquierda a derecha

Nota: Un operador de sustracción debe ir precedido de espacio en blanco si, de lo contrario, el operador podríainterpretarse como parte de un símbolo anterior. Por ejemplo, a-b se interpreta como un nombre, pero a - b y a -bse interpretan como operaciones aritméticas.

El resultado de una expresión aritmética es uno de los elementos siguientes:v Un valor numéricov Un valor de fecha u hora

Programación SQL XML 175

Page 184: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v Un valor de duraciónv Una secuencia vacíav Un error

DB2 XPath utiliza el siguiente proceso para evaluar una expresión aritmética.1. Atomiza cada operando en una secuencia de valores atómicos.2. Utiliza las siguientes reglas para evaluar los operandos de la expresión aritmética:

v Si el operando atomizado es una secuencia vacía, el resultado de la expresión aritmética es unasecuencia vacía.

v Si el operando atomizado es una secuencia que contiene más de un valor, se devuelve un error.v Si el operando atomizado es un valor atómico sin tipo (xs:untypedAtomic), DB2 XPath convierte el

valor a xs:double. Si la conversión falla, DB2 XPath devuelve un error.3. Si los tipos de los operandos son una combinación válida para el operador aritmético, DB2 XPath

aplica el operador a los valores atomizados. El resultado de esta operación es un valor atómico o unerror dinámico (por ejemplo, un error podría ser el resultado de dividir un xs:integer por cero).

4. Si los tipos de los operandos no son una combinación válida para el operador aritmético, DB2 XPathgenera un error de tipo.

La tabla siguiente identifica las combinaciones válidas de tipos para operadores aritméticos. En esta tabla,la letra A representa el primer operando de la expresión y la letra B representa el segundo operando. Eltérmino numérico indica los tipos de xs:integer, xs:decimal, xs:double o cualquier tipo derivado de unode estos tipos. Si el tipo de resultado de un se indica como numérico, el tipo de resultado será el primertipo de la lista ordenada (xs:integer, xs:decimal, xs:double) al que pueden convertirse todos los operandospor sustitución de subtipo y promoción de tipo.

Tabla 58. Tipos válidos para operandos de expresiones aritméticas

Operador con operandos Tipo de operando A Tipo de operando B Tipo de resultado

A + B numérico numérico numérico

xs:date xs:yearMonthDuration xs:date

xs:yearMonthDuration xs:date xs:date

xs:date xs:dayTimeDuration xs:date

xs:dayTimeDuration xs:date xs:date

xs:time xs:dayTimeDuration xs:time

xs:dayTimeDuration xs:time xs:time

xs:dateTime xs:yearMonthDuration xs:dateTime

xs:yearMonthDuration xs:dateTime xs:dateTime

xs:dateTime xs:dayTimeDuration xs:dateTime

xs:dayTimeDuration xs:dateTime xs:dateTime

xs:yearMonthDuration xs:yearMonthDuration xs:yearMonthDuration

xs:dayTimeDuration xs:dayTimeDuration xs:dayTimeDuration

176 IBM i: Programación SQL XML

Page 185: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 58. Tipos válidos para operandos de expresiones aritméticas (continuación)

Operador con operandos Tipo de operando A Tipo de operando B Tipo de resultado

A - B numérico numérico numérico

xs:date xs:date xs:dayTimeDuration

xs:date xs:yearMonthDuration xs:date

xs:date xs:dayTimeDuration xs:date

xs:time xs:time xs:dayTimeDuration

xs:time xs:dayTimeDuration xs:time

xs:dateTime xs:dateTime xs:dayTimeDuration

xs:dateTime xs:yearMonthDuration xs:dateTime

xs:dateTime xs:dayTimeDuration xs:dateTime

xs:yearMonthDuration xs:yearMonthDuration xs:yearMonthDuration

xs:dayTimeDuration xs:dayTimeDuration xs:dayTimeDuration

A * B numérico numérico numérico

xs:yearMonthDuration numérico xs:yearMonthDuration

numérico xs:yearMonthDuration xs:yearMonthDuration

xs:dayTimeDuration numérico xs:dayTimeDuration

numérico xs:dayTimeDuration xs:dayTimeDuration

A idiv B numérico numérico xs:integer

A div B numérico numérico numérico; pero xs:decimalsi ambos operandos sonxs:integer

xs:yearMonthDuration numérico xs:yearMonthDuration

xs:dayTimeDuration numérico xs:dayTimeDuration

xs:yearMonthDuration xs:yearMonthDuration xs:decimal

xs:dayTimeDuration xs:dayTimeDuration xs:decimal

A mod B numérico numérico numérico

Sintaxis

expresión aritmética

�� expresión-multiplicativa+ expresión-multiplicativa- expresión-multiplicativa

��

Programación SQL XML 177

Page 186: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

expresión multiplicativa

�� �

expresión_vía_acceso+-

* expresión_vía_accesodiv +idiv -mod

��

Ejemplos

La consulta siguiente utiliza una expresión aritmética para calcular el importe que los compradores paganen impuestos sobre un producto, a una tasa del 8,25%, y selecciona los elementos de descripción para losque el impuesto es superior a una unidad de moneda.SELECT X.* FROM T1, XMLTABLE(’declare namespace pos="http://posample.org";

/pos:product/description[price * .0825 > 1]’PASSING T1.DESCRIPTION) X;

La consulta siguiente resta dos valores xs:date, lo que da como resultado el valor dexs:yearMonthDuration P8559D:SELECT * FROM XMLTABLE(’xs:date("2005-10-10") - xs:date("1982-05-05")’) X;

Expresiones de comparaciónLas expresiones de comparación comparan dos valores. DB2 XPath proporciona un tipo de expresión decomparación: comparaciones generales.

Comparaciones genéricas:

Las comparaciones genéricas comparan dos secuencias de cualquier longitud para determinar si unacomparación es verdadera como mínimo para un elemento de ambas secuencias. Los operadores decomparación genérica incluyen =, !=, <, <=, > y >=.

La tabla siguiente describe estos operadores, listados por orden de prioridad de operador de mayor amenor.

Tabla 59. Operadores de comparación genérica de XPath

Operador Finalidad

= Devuelve true si algún valor de la primera secuencia es igual a algún valor de la segundasecuencia.

!= Devuelve true si algún valor de la primera secuencia no es igual a algún valor de la segundasecuencia.

< Devuelve true si algún valor de la primera secuencia es menor que algún valor de la segundasecuencia.

<= Devuelve true si algún valor de la primera secuencia es menor o igual que algún valor de lasegunda secuencia.

> Devuelve true si algún valor de la primera secuencia es mayor que algún valor de la segundasecuencia.

>= Devuelve true si algún valor de la primera secuencia es mayor o igual que algún valor de lasegunda secuencia.

178 IBM i: Programación SQL XML

Page 187: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

El resultado de una expresión de comparación genérica es un valor booleano o un error. DB2 XPathutiliza el siguiente proceso para evaluar una expresión de comparación genérica.1. Atomiza cada operando en una secuencia de valores atómicos.2. Compara cada uno de los valores de la primera secuencia con cada uno de los valores de la segunda

secuencia. Para las comparaciones de series, se utiliza la ordenación predeterminada. Para cadacomparación:v Si uno de los valores atómicos es una instancia de xs:untypedAtomic y el otro es una instancia de

un tipo numérico (xs:integer, xs:decimal o xs:double), el valor sin tipo se convierte al tipoxs:double.

v Si uno de los valores atómicos es una instancia de xs:untypedAtomic y el otro es una instancia dexs:untypedAtomic o xs:string, los valores xs:untypedAtomic se convierten al tipo xs:string.

v Si uno de los valores atómicos es una instancia de xs:untypedAtomic y el otro no es una instanciade xs:string, xs:untypedAtomic o cualquier tipo numérico, el valor de xs:untypedAtomic seconvierte al tipo dinámico del otro valor.

3. Si al menos uno de los valores de la primera secuencia y al menos uno de los valores de la segundasecuencia cumplen las condiciones de la comparación, la comparación genérica es verdadera.

Sintaxis

expresión de comparación

�� expresión-aritmética= expresión-aritmética!=<><=>=

��

Ejemplos

La sentencia siguiente utiliza una expresión de comparación genérica para buscar las descripciones deproductos que cuestan menos de 20 unidades.declare namespace pos="http://posample.org";

/pos:product/description[price < 20]

Expresiones lógicasLas expresiones lógicas devuelven el valor booleano true si ambas expresiones son verdaderas, o si una oambas expresiones son verdaderas. Los operadores que se utilizan en expresiones lógicas incluyen and yor.

La tabla siguiente describe estos operadores, listados por orden de prioridad de operador de mayor amenor.

Tabla 60. Operadores de expresión lógica en XPath

Operador Finalidad

and Devuelve true si ambas expresiones son verdaderas.

or Devuelve true si una o ambas expresiones son verdaderas.

El resultado de una expresión lógica es un valor booleano o un error. DB2 XPath utiliza el siguienteproceso para evaluar una expresión lógica.1. Determina el valor booleano efectivo (EBV) de cada operando.

Programación SQL XML 179

Page 188: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

2. Aplica el operador a los valores booleanos efectivos de los operandos. El resultado es un valorbooleano o un error. La Tabla 61 muestra los resultados devueltos por una expresión lógica en funcióndel EBV de sus operandos y los errores que se encuentran durante la evaluación de un operando.

Tabla 61. Resultados de expresiones lógicas en función de los valores booleanos efectivos (EBV) de los operandos

EBV de operando 1 Operador EBV de operando 2 Resultado

true and true true

true and false false

false and true false

false and false false

true and error error

error and true error

false and error false o error

error and false false o error

error and error error

true or true true

false or false false

true or false true

false or true true

true or error true o error

error or true true o error

false or error error

error or false error

error or error error

Sintaxis

expresión lógica

��

expresión

and expresiónor

��

Ejemplos

El ejemplo siguiente utiliza una expresión lógica para recuperar los registros correspondientes a palaspara nieve de 22 o 24 pulgadas.declare namespace pos="http://posample.org";

/pos:product/description[name = "Snow Shovel, Deluxe 24"or name = "Snow Shovel, Basic 22"]

Expresiones regularesUna expresión regular es una secuencia de caracteres que actúa como modelo para la coincidencia ymanipulación de series. Las expresiones regulares se utilizan en funciones fn:matches, fn:replace yfn:tokenize.

180 IBM i: Programación SQL XML

Page 189: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Sintaxis

�� � �

|

carácter^ . ? $

escape-clase-carácter *[ grupo-caracteres ] +( expresión-regular )

��

grupo-caracteres

�� � carácter^ escape-clase-carácter carácter

escape-clase-carácter

��

carácterEn una expresión regular, un carácter es un carácter XML normal que no es un metacarácter.

metacaracteresLos metacaracteres son caracteres de control en las expresiones regulares. Los metacaracteres deexpresiones regulares que están soportados actualmente son:

barra inclinada invertida (\)Inicia un escape de clase de carácter. Un escape de clase de carácter indica que el metacaráctersiguiente debe utilizarse como carácter, en lugar de un metacarácter.

punto (.)Coincide con cualquier carácter individual, excepto con el carácter de nueva línea (\n).

signo de intercalación (^)Si el carácter de intercalación aparece fuera de una clase de carácter, los caracteres que le siguencoinciden con el inicio de la serie de entrada o, para series de entrada de varias líneas, con elinicio de una línea. Una serie de entrada se considera como una serie de entrada de varias líneassi la función que utiliza la serie de entrada incluye el distintivo m.

Si el carácter de intercalación aparece como primer carácter en una clase de carácter, el carácterde intercalación actúa como un signo de negación. Se produce una coincidencia si ninguno de loscaracteres del grupo de caracteres aparece en la serie que se compara con la expresión regular.

signo de dólar ($)Coincide con el final de la serie de entrada o, para series de entrada de varias líneas, con el finalde una línea. Una serie de entrada se considera como una serie de entrada de varias líneas si lafunción que utiliza la serie de entrada incluye el distintivo m.

signo de interrogación (?)Coincide con el carácter o grupo de caracteres anteriores de la expresión regular cero o una vez.

asterisco (*)Coincide con el carácter o grupo de caracteres anteriores de la expresión regular de cero o másveces.

signo Más (+)Coincide con el carácter o grupo de caracteres anteriores de la expresión regular una o más veces.

Programación SQL XML 181

Page 190: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

barra vertical (|)Coincide con el carácter (o grupo de caracteres) anterior o el carácter (o grupo de caracteres)siguiente.

corchete de apertura ([) y corchete de cierre (])Los corchetes de apertura y cierre y el grupo de caracteres que incluyen definen una clase decarácter. Por ejemplo, la clase de carácter [aeiou] coincide con cualquier vocal. Las clases decarácter también admiten rangos de caracteres. Por ejemplo:v [a-z] significa cualquier letra minúscula.v [a-p] significa cualquier letra minúscula de la a a la p.v [0-9] significa cualquier dígito único.

paréntesis de apertura (() y paréntesis de cierre ())Un paréntesis de apertura y uno de cierre indican una agrupación de algunos caracteres dentrode una expresión regular. A continuación, puede aplicar un operador, como por ejemplo unoperador de repetición, a todo el grupo.

La llave de apertura ({) y la llave de cierre (}) también son metacaracteres, pero actualmente no estánsoportados.

escape-clase-carácterUn escape de clase de carácter especifica que determinados caracteres especiales deben tratarse comocaracteres, en lugar de realizar alguna función. Un escape de clase de carácter consta de una barrainclinada invertida (\), seguida de un único metacarácter, carácter de nueva línea, carácter de retornoo carácter de tabulación. La tabla siguiente lista los escapes de clase de carácter.

Tabla 62. Escapes de clase de carácter de carácter único

Escape de carácter Carácter representado Descripción

\n #x0A Nueva línea

\r #x0D Retorno

\t #x09 Tabulador

\\ \ Barra inclinada invertida

\| | Barra vertical

\. . Punto

\? ? Signo de interrogación

\* * Asterisco

\+ + Signo Más

\( ( Paréntesis de apertura

\) ) Paréntesis de cierre

\{ { Llave de apertura

\} } Llave de cierre

\$ $ Signo de dólar

\- - Guión

\[ [ Corchete de apertura

\] ] Corchete de cierre

\^ ^ Acento circunflejo

grupo-caracteresUn grupo de caracteres es el conjunto de caracteres de una clase de carácter. La clase de carácter seutiliza para la comparación. Puede constar de caracteres, rangos de caracteres, escapes de clase de

182 IBM i: Programación SQL XML

Page 191: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

carácter y un símbolo de apertura opcional. Si incluye el signo de intercalación, indica elcomplemento del conjunto de caracteres definidos por el resto del grupo de caracteres.

Ejemplos

Los ejemplos siguientes muestran cómo afecta cada uno de los metacaracteres a una expresión regular.v "hello[0-9]world" coincide con "hello3world", pero no con "hello world".v "^hello" coincide con este texto:

hello world

Sin embargo, "^hello" no coincide con este texto:world hello

v "hello$" coincide con este texto:world hello

Sin embargo, "hello$" no coincide con este texto:hello world

v "(ca)|(bd)" coincide con "arcade" o "abdicate".v "^((ca)|(bd))" no coincide con "arcade" o "abdicate".v "w?s" coincide con "ws" o "s".v "w.*s" coincide con "was" o "waters".v "be+t" coincide con "beet" o "bet".v "\[n\]" coincide con "[n]".

Descripciones de funciones XPathLas funciones de DB2 XPath son un subconjunto de las funciones y operadores de XPath 2.0 y XQuery1.0.

Estos temas ofrecen información de consulta detallada para las funciones de XPath soportadas por DB2for i. Las funciones pueden utilizarse en cualquier lugar de una expresión XPath donde se espere unaexpresión. Las funciones soportadas se indican en las tablas siguientes:

Tabla 63. Funciones de serie

Función Descripción Referencia

fn:compare Devuelve una indicación de si dos series secomparan como igual, menor que o mayor que.

“Función fn:compare” en lapágina 193

fn:concat Devuelve dos o más series concatenadas en unasola serie.

“Función fn:concat” en lapágina 194

fn:contains Devuelve una indicación de si una serie contieneuna determinada subserie.

“Función fn:contains” en lapágina 194

fn:lower-case Devuelve una serie convertida en minúsculas. “Función fn:lower-case” en lapágina 206

fn:matches Devuelve una indicación de si una serie coincidecon un determinado patrón.

“Función fn:matches” en lapágina 207

fn:max Devuelve el máximo de los valores de unasecuencia.

“Función fn:max” en la página208

fn:min Devuelve el mínimo de los valores de unasecuencia.

“Función fn:min” en la página209

fn:normalize-space Devuelve una serie con los espacios en blancoiniciales y finales eliminados y cada secuenciainterna de caracteres de espacio en blancosustituida por un único carácter en blanco.

“Función fn:normalize-space”en la página 215

Programación SQL XML 183

Page 192: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 63. Funciones de serie (continuación)

Función Descripción Referencia

fn:replace Devuelve una serie que contiene los caracteres quecoinciden con un patrón sustituidos por otroconjunto de caracteres.

“Función fn:replace” en lapágina 217

fn:starts-with Indica si una serie comienza por una determinadasubserie.

“Función fn:starts-with” en lapágina 220

fn:string Devuelve la representación de serie de un valor. “Función fn:string” en lapágina 221

fn:string-length Devuelve la longitud de una serie. “Función fn:string-length” enla página 222

fn:substring Devuelve una subserie de una serie. “Función fn:substring” en lapágina 222

fn:tokenize Devuelve una lista de subseries dentro de unaserie.

“Función fn:tokenize” en lapágina 225

fn:translate Devuelve una serie con los caracteres seleccionadossustituidos por otros caracteres.

“Función fn:translate” en lapágina 227

fn:upper-case Devuelve una serie de caracteres convertida amayúsculas.

“Función fn:upper-case” en lapágina 228

Tabla 64. Funciones de número

Función Descripción Referencia

fn:abs Devuelve el valor absoluto de un valor numérico. “Función fn:abs” en la página187

fn:max Devuelve el máximo de los valores de unasecuencia.

“Función fn:max” en la página208

fn:min Devuelve el mínimo de los valores de unasecuencia.

“Función fn:min” en la página209

fn:round Devuelve el entero más cercano al valorespecificado.

“Función fn:round” en lapágina 218

fn:sum Devuelve la suma de los valores de una secuencia. “Función fn:sum” en la página223

Tabla 65. Funciones booleanas

Función Descripción Referencia

fn:boolean Devuelve el valor booleano efectivo de unasecuencia.

“Función fn:boolean” en lapágina 192

fn:exists Devuelve false si el argumento produce unresultado vacío; de lo contrario, devuelve true.

“Función fn:exists” en lapágina 201

fn:not Devuelve false si el valor booleano efectivo de unaexpresión de secuencia es verdadero y devuelvetrue si el valor booleano efectivo de una expresiónde secuencia es falso.

“Función fn:not” en la página215

Tabla 66. Funciones de fecha, hora y duración

Función Descripción Referencia

fn:adjust-date-to-timezone Devuelve un valor xs:date con su huso horarioajustado o eliminado.

“Funciónfn:adjust-date-to-timezone” enla página 188

184 IBM i: Programación SQL XML

Page 193: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 66. Funciones de fecha, hora y duración (continuación)

Función Descripción Referencia

fn:adjust-dateTime-to-timezone Devuelve un valor xs:dateTime con su huso horarioajustado o eliminado.

“Funciónfn:adjust-dateTime-to-timezone”en la página 189

fn:adjust-time-to-timezone Devuelve un valor xs:time con su huso horarioajustado o eliminado.

“Funciónfn:adjust-time-to-timezone” enla página 191

fn:current-date Devuelve la fecha actual en el huso horarioimplícito de UTC.

“Función fn:current-date” enla página 195

fn:current-dateTime Devuelve la fecha y hora actuales en el husohorario implícito de UTC.

“Función fn:current-dateTime”en la página 196

db2-fn:current-local-date Devuelve la fecha actual en el huso horario local. “Funcióndb2-fn:current-local-date” enla página 196

db2-fn:current-local-dateTime Devuelve la fecha y hora actuales en el husohorario local.

“Funcióndb2-fn:current-local-dateTime”en la página 196

db2-fn:current-local-time Devuelve la hora actual en el huso horario local. “Funcióndb2-fn:current-local-time” enla página 197

fn:current-time Devuelve la hora actual en el huso horarioimplícito de UTC.

“Función fn:current-time” enla página 197

fn:dateTime Devuelve un valor xs:dateTime a partir de un valorxs:date y un valor xs:time.

“Función fn:dateTime” en lapágina 198

fn:day-from-date Devuelve el componente de día de un valorxs:date.

“Función fn:day-from-date” enla página 199

fn:day-from-dateTime Devuelve el componente de día de un valorxs:dateTime.

“Funciónfn:day-from-dateTime” en lapágina 199

fn:days-from-duration Devuelve el componente de días de una duración. “Funciónfn:days-from-duration” en lapágina 200

fn:hours-from-dateTime Devuelve el componente de horas de un valorxs:dateTime.

“Funciónfn:hours-from-dateTime” en lapágina 202

fn:hours-from-duration Devuelve el componente de horas de un valor deduración.

“Funciónfn:hours-from-duration” en lapágina 202

fn:hours-from-time Devuelve el componente de horas de un valorxs:time.

“Función fn:hours-from-time”en la página 203

fn:implicit-timezone Devuelve el valor de huso horario implícito dePT0S, que indica que UTC es el huso horarioimplícito.

“Funciónfn:implicit-timezone” en lapágina 203

db2-fn:local-timezone Devuelve el huso horario del sistema local. “Funcióndb2-fn:local-timezone” en lapágina 206

fn:max Devuelve el máximo de los valores de unasecuencia.

“Función fn:max” en la página208

fn:min Devuelve el mínimo de los valores de unasecuencia.

“Función fn:min” en la página209

Programación SQL XML 185

Page 194: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 66. Funciones de fecha, hora y duración (continuación)

Función Descripción Referencia

fn:minutes-from-dateTime Devuelve el componente de minutos de un valorxs:dateTime.

“Funciónfn:minutes-from-dateTime” enla página 210

fn:minutes-from-duration Devuelve el componente de minutos de unaduración.

“Funciónfn:minutes-from-duration” enla página 210

fn:minutes-from-time Devuelve el componente de minutos de un valorxs:time.

“Funciónfn:minutes-from-time” en lapágina 211

fn:month-from-date Devuelve el componente de meses de un valorxs:date.

“Función fn:month-from-date”en la página 212

fn:month-from-dateTime Devuelve el componente de meses de un valorxs:dateTime.

“Funciónfn:month-from-dateTime” enla página 212

fn:months-from-duration Devuelve el componente de meses de unaduración.

“Funciónfn:months-from-duration” enla página 213

fn:seconds-from-dateTime Devuelve el componente de segundos de un valorxs:dateTime.

“Funciónfn:seconds-from-dateTime” enla página 219

fn:seconds-from-duration Devuelve el componente de segundos de unaduración.

“Funciónfn:seconds-from-duration” enla página 219

fn:seconds-from-time Devuelve el componente de segundos de un valorxs:time.

“Funciónfn:seconds-from-time” en lapágina 220

fn:sum Devuelve la suma de los valores de una secuencia. “Función fn:sum” en la página223

fn:timezone-from-date Devuelve el componente de huso horario de unvalor xs:date.

“Funciónfn:timezone-from-date” en lapágina 223

fn:timezone-from-dateTime Devuelve el componente de huso horario de unvalor xs:dateTime.

“Funciónfn:timezone-from-dateTime”en la página 224

fn:timezone-from-time Devuelve el componente de huso horario de unvalor xs:time.

“Funciónfn:timezone-from-time” en lapágina 225

fn:year-from-date Devuelve el componente de año de un valorxs:date.

“Función fn:year-from-date”en la página 228

fn:year-from-dateTime Devuelve el componente de año de un valorxs:dateTime.

“Funciónfn:year-from-dateTime” en lapágina 229

fn:years-from-duration Devuelve el componente de años de una duración. “Funciónfn:years-from-duration” en lapágina 229

186 IBM i: Programación SQL XML

Page 195: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 67. Funciones de secuencia

Función Descripción Referencia

fn:count Devuelve el número de valores de una secuencia. “Función fn:count” en lapágina 195

fn:data Devuelve una secuencia de valores atómicos deuna secuencia de elementos.

“Función fn:data” en lapágina 198

fn:distinct-values Devuelve los valores diferenciados de unasecuencia.

“Función fn:distinct-values”en la página 200

fn:last Devuelve el número de valores de la secuencia deelementos que se está procesando actualmente.

“Función fn:last” en la página204

fn:position Devuelve la posición del elemento de contexto deuna secuencia que se está procesando actualmente.

“Función fn:position” en lapágina 216

Tabla 68. Funciones de nodo

Función Descripción Referencia

fn:local-name Devuelve la propiedad de nombre local de unnodo.

“Función fn:local-name” en lapágina 205

fn:name Devuelve las partes de prefijo y nombre local deun nombre de nodo.

“Función fn:name” en lapágina 213

Función fn:absLa función fn:abs devuelve el valor absoluto de un valor numérico.

Sintaxis

�� fn:abs(valor-numérico) ��

valor-numéricoUn valor atómico o una secuencia vacía.

Si valor-numérico es un valor atómico, tiene uno de los tipos siguientes:v xs:doublev xs:decimalv xs:integerv Un tipo derivado de cualquiera de los tipos listados anteriormentev xs:untypedAtomic

Si valor-numérico tiene el tipo de datos xs:untypedAtomic, se convierte en un valor xs:double.

Valor devuelto

Si valor-numérico no es la secuencia vacía, el valor devuelto es el valor absoluto de valor-numérico.

Si valor-numérico es la secuencia vacía, fn:abs devuelve la secuencia vacía.

El tipo de datos del valor devuelto depende del tipo de datos de valor-numérico:v Si valor-numérico es xs:double, xs:decimal o xs:integer, el valor que se devuelve tiene el mismo tipo que

valor-numérico.v Si valor-numérico tiene un tipo de datos derivado de xs:double, xs:decimal o xs:integer, el valor que se

devuelve tiene el tipo de datos padre directo de valor-numérico.v Si valor-numérico tiene el tipo de datos xs:untypedAtomic, el valor que se devuelve tiene el tipo de

datos xs:double.

Programación SQL XML 187

Page 196: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo

La función siguiente devuelve el valor absoluto de –10.5.fn:abs(-10.5)

El valor devuelto es 10.5.

Función fn:adjust-date-to-timezoneLa función fn:adjust-date-to-timezone ajusta un valor xs:date a un huso horario específico o elimina elcomponente de huso horario del valor.

Sintaxis

�� fn:adjust-date-to-timezone(valor-fecha ),valor-huso-horario

��

valor-fechaEl valor de fecha que debe ajustarse.

valor-fecha es de tipo xs:date o es una secuencia vacía.

valor-huso-horarioUna duración que representa el huso horario al que valor-fecha debe ajustarse.

valor-huso-horario puede ser una secuencia vacía o un solo valor de tipo xs:dayTimeDuration entre-PT14H y PT14H, ambos inclusive. El valor puede ser un número de minutos entero y no debetener un componente de segundos. Si valor-huso-horario no se especifica, el valor predeterminadoes PT0H, que representa la hora UTC.

Valor devuelto

El valor devuelto es un valor de tipo xs:date o una secuencia vacía en función de los parámetros que seespecifican. Si valor-fecha no es una secuencia vacía, el valor devuelto es de tipo xs:date. La tabla siguientedescribe los posibles valores devueltos:

Tabla 69. Tipos de valores de entrada y valor devuelto para fn:adjust-date-to-timezone

valor-fecha valor-huso-horario Valor devuelto

valor-fecha que contiene uncomponente de huso horario

Un valor explícito o ningún valorespecificado (duración de PT0H)

El valor-fecha ajustado al huso horariorepresentado por valor-huso-horario.

valor-fecha que contiene uncomponente de huso horario

Una secuencia vacía El valor-fecha sin ningún componentede huso horario.

valor-fecha sin ningún componente dehuso horario

Un valor explícito o ningún valorespecificado (duración de PT0H)

El valor-fecha con un componente dehuso horario. El componente de husohorario es el huso horariorepresentado por valor-huso-horario. Elcomponente de fecha no se ajustapara el huso horario.

valor-fecha sin ningún componente dehuso horario

Una secuencia vacía El valor-fecha.

Una secuencia vacía Un valor explícito, secuencia vacía oningún valor especificado

Una secuencia vacía.

Al ajustar valor-fecha a un huso horario diferente, valor-fecha se trata como un valor de fecha y hora con elcomponente de hora 00:00:00. El valor devuelto contiene el componente de huso horario representado porvalor-huso-horario. La función siguiente calcula el valor de fecha ajustado:

188 IBM i: Programación SQL XML

Page 197: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

xs:date(fn:adjust-dateTime-to-timezone(xs:dateTime(valor-fecha),valor-huso-horario))

Ejemplos

En los ejemplos siguientes, la variable $tz es una duración de -10 horas, definida comoxs:dayTimeDuration("-PT10H").

La función siguiente ajusta el valor de fecha del 7 de mayo de 2009 en el huso horario UTC+1. La funciónespecifica un valor-huso-horario -PT10H.fn:adjust-date-to-timezone(xs:date("2009-05-07+01:00"), $tz)

El valor de fecha devuelto es 2009-05-06-10:00. La fecha se ajusta al huso horario UTC-10.

La función siguiente añade un componente de huso horario al valor de fecha del 7 de marzo de 2009 sincomponente de huso horario. La función especifica un valor-huso-horario -PT10H.fn:adjust-date-to-timezone(xs:date("2009-03-07"), $tz)

El valor devuelto es 2009-03-07-10:00. El componente de huso horario se añade al valor de fecha.

La función siguiente ajusta el valor de fecha del 9 de febrero de 2009 en el huso horario UTC-7. Sin unvalor-huso-horario especificado, la función utiliza el valor-huso-horario predeterminado PT0H.fn:adjust-date-to-timezone(xs:date("2009-02-09-07:00"))

La fecha devuelta es 2009-02-09Z, ajustada a UTC.

La función siguiente elimina el componente de huso horario del valor de fecha del 7 de mayo de 2009 enel huso horario UTC-7. El valor-huso-horario es una secuencia vacía.fn:adjust-date-to-timezone(xs:date("2009-05-07-07:00"), ())

El valor devuelto es 2009-05-07.

Función fn:adjust-dateTime-to-timezoneLa función fn:adjust-dateTime-to-timezone ajusta un valor xs:dateTime a un huso horario específico oelimina el componente de huso horario del valor.

Sintaxis

�� fn:adjust-dateTime-to-timezone(valor-fecha-hora ),valor-huso-horario

��

valor-fecha-horaEl valor de fecha y hora que se debe ajustar.

valor-fecha-hora es de tipo xs:dateTime o es una secuencia vacía.

valor-huso-horarioUna duración que representa el huso horario al que valor-fecha-hora debe ajustarse.

valor-huso-horario puede ser una secuencia vacía o un solo valor de tipo xs:dayTimeDuration entre-PT14H y PT14H, ambos inclusive. El valor puede ser un número entero en minutos y no debetener un componente de segundos. Si valor-huso-horario no se especifica, el valor predeterminadoes PT0H, que representa la hora UTC.

Programación SQL XML 189

Page 198: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Valor devuelto

El valor devuelto es un valor de tipo xs:dateTime o una secuencia vacía en función de los tipos de valoresde entrada. Si valor-fecha-hora no es una secuencia vacía, el valor devuelto es de tipo xs:dateTime. La tablasiguiente describe los posibles valores devueltos:

Tabla 70. Tipos de valores de entrada y valor devuelto para fn:adjust-dateTime-to-timezone

valor-fecha-hora valor-huso-horario Valor devuelto

valor-fecha-hora que contiene uncomponente de huso horario

Un valor explícito o ningún valorespecificado (duración de PT0H)

El valor-fecha-hora ajustado al husohorario representado porvalor-huso-horario. El valor devueltocontiene el componente de husohorario representado porvalor-huso-horario.

valor-fecha-hora que contiene uncomponente de huso horario

Una secuencia vacía El valor-fecha-hora sin ningúncomponente de huso horario.

valor-fecha-hora sin ningúncomponente de huso horario

Un valor explícito o ningún valorespecificado (duración de PT0H)

El valor-fecha-hora con un componentede huso horario. El componente dehuso horario es el huso horariorepresentado por valor-huso-horario.Los componentes de fecha y hora nose ajustan al huso horario.

valor-fecha-hora sin ningúncomponente de huso horario

Una secuencia vacía El valor-fecha-hora.

Una secuencia vacía Un valor explícito, secuencia vacía oningún valor especificado

Una secuencia vacía.

Ejemplos

En los ejemplos siguientes, la variable $tz es una duración de -10 horas, definida comoxs:dayTimeDuration("-PT10H").

La función siguiente ajusta el valor de fecha y hora de 7 de marzo de 2009 a las 10:00 a.m. en el husohorario UTC-7 al huso horario especificado por valor-huso-horario -PT10H.fn:adjust-dateTime-to-timezone(xs:dateTime("2009-03-07T10:00:00-07:00"), $tz)

El valor de fecha y hora devuelto es 2009-03-07T07:00:00-10:00.

La función siguiente ajusta el valor de fecha y hora del 7 de marzo de 2009 a las 10:00 am. Elvalor-fecha-hora no tiene un componente de huso horario, y la función especifica un valor-huso-horario-PT10H.fn:adjust-dateTime-to-timezone(xs:dateTime("2009-03-07T10:00:00"), $tz)

La fecha y hora devuelta es 2009-03-07T10:00:00-10:00.

La siguiente función ajusta el valor de fecha y hora del 4 de junio de 2009 a las 10:00 a.m. en el husohorario UTC-7. Sin un valor-huso-horario especificado, la función utiliza el valor de huso horariopredeterminado PT0H.fn:adjust-dateTime-to-timezone(xs:dateTime("2009-06-04T10:00:00-07:00"))

El valor de fecha y hora devuelto es 2009-06-04T17:00:00Z, que es el valor de fecha y hora ajustado aUTC.

190 IBM i: Programación SQL XML

Page 199: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

La función siguiente elimina el componente de huso horario del valor de fecha y hora del 7 de marzo de2009 a las 10:00 a.m. en el huso horario UTC-7. El valor-huso-horario es la secuencia vacía.fn:adjust-dateTime-to-timezone(xs:dateTime("2009-03-07T10:00:00-07:00"), ())

El valor de dateTime devuelto es 2009-03-07T10:00:00.

Función fn:adjust-time-to-timezoneLa función fn:adjust-time-to-timezone ajusta un valor xs:time a un huso horario específico o elimina elcomponente de huso horario del valor.

Sintaxis

�� fn:adjust-time-to-timezone(valor-hora ),valor-huso-horario

��

valor-horaEl valor de hora que se debe ajustar.

valor-hora es de tipo xs:time o es una secuencia vacía.

valor-huso-horarioUna duración que representa el huso horario al que valor-hora debe ajustarse.

valor-huso-horario puede ser una secuencia vacía o un solo valor de tipo xs:dayTimeDuration entre-PT14H y PT14H, ambos inclusive. El valor puede ser un número de minutos entero y no debetener un componente de segundos. Si valor-huso-horario no se especifica, el valor predeterminadoes PT0H, que representa la hora UTC.

Valor devuelto

El valor devuelto es un valor de tipo xs:time o una secuencia vacía en función de los parámetros que seespecifican. Si valor-hora no es una secuencia vacía, el valor devuelto es de tipo xs:time. La tabla siguientedescribe los posibles valores devueltos:

Tabla 71. Tipos de valores de entrada y valor devuelto para fn:adjust-time-to-timezone

valor-fecha valor-huso-horario Valor devuelto

valor-hora que contiene uncomponente de huso horario

Un valor explícito o ningún valorespecificado (duración de PT0H)

El valor-hora ajustado al huso horariorepresentado por valor-huso-horario. Elvalor devuelto contiene elcomponente de huso horariorepresentado por valor-huso-horario. Siel ajuste de huso horario pasa de lamedianoche, el cambio de fecha seignora.

valor-hora que contiene uncomponente de huso horario

Una secuencia vacía El valor-hora sin ningún componentede huso horario.

valor-hora sin ningún componente dehuso horario

Un valor explícito o ningún valorespecificado (duración de PT0H)

El valor-hora con un componente dehuso horario. El componente de husohorario es el huso horariorepresentado por valor-huso-horario. Elcomponente de hora no se ajusta parael huso horario.

valor-hora sin ningún componente dehuso horario

Una secuencia vacía El valor-hora.

Una secuencia vacía Un valor explícito, secuencia vacía oningún valor especificado

Una secuencia vacía.

Programación SQL XML 191

Page 200: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplos

En los ejemplos siguientes, la variable $tz es una duración de -10 horas, definida comoxs:dayTimeDuration("-PT10H").

La función siguiente ajusta el valor de hora 10:00 a.m. en el huso horario UTC-7, y la función especificaun valor-huso-horario -PT10H.fn:adjust-time-to-timezone(xs:time("10:00:00-07:00"), $tz)

El valor devuelto es 7:00:00-10:00. La hora se ajusta al huso horario representado por la duración -PT10H.

La función siguiente ajusta el valor de hora para 1:00 p.m. El valor de hora no tiene un componente dehuso horario.fn:adjust-time-to-timezone(xs:time("13:00:00"), $tz)

El valor devuelto es 13:00:00-10:00. La hora contiene un componente de huso horario representado por laduración -PT10H.

La función siguiente ajusta el valor de hora para 10:00 en el huso horario UTC-7. La función no especificaun valor-huso-horario y utiliza el valor predeterminado PT0H.fn:adjust-time-to-timezone(xs:time("10:00:00-07:00"))

El valor devuelto es 17:00:00Z, con la hora ajustada a UTC.

La función siguiente elimina el componente de huso horario del valor de hora 8:00 am en el huso horarioUTC-7. El valor-huso-horario es la secuencia vacía.fn:adjust-time-to-timezone(xs:time("08:00:00-07:00"), ())

El valor devuelto es 8:00:00.

El ejemplo siguiente compara dos horas. El ajuste de huso horario pasa de la medianoche y provoca uncambio de fecha. Sin embargo, fn:adjust-time-to-timezone ignora los cambios de fecha.fn:adjust-time-to-timezone(xs:time("01:00:00+14:00"), $tz)

= xs:time("01:00:00-10:00")

El valor devuelto es true.

Función fn:booleanLa función fn:boolean devuelve el valor booleano efectivo de una secuencia.

Sintaxis

�� fn:boolean(expresión-secuencia) ��

expresión-secuenciaCualquier secuencia que contenga elementos de cualquier tipo, o la secuencia vacía.

Valor devuelto

El valor booleano efectivo (EBV) devuelto depende del valor de expresión-secuencia:

Tabla 72. EBV devueltos para tipos de valores específicos

Descripción del valor EBV devuelto

Una secuencia vacía false

192 IBM i: Programación SQL XML

Page 201: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Tabla 72. EBV devueltos para tipos de valores específicos (continuación)

Descripción del valor EBV devuelto

Una secuencia cuyo primer elemento es un nodo true

Un solo valor de tipo xs:boolean (o derivado dexs:boolean)

false - si el valor de xs:boolean es false

true - si el valor de xs:boolean es true

Un solo valor de tipo xs:string o xs:untypedAtomic (oderivado de uno de estos tipos)

false - si la longitud del valor es cero

true - si la longitud del valor es mayor que cero

Un solo valor de cualquier tipo numérico (o derivado decualquier tipo numérico)

false - si el valor es NaN o es numéricamente igual a cero

true - si el valor no es numéricamente igual a cero

Todos los demás valores error

Nota: el valor booleano efectivo de una secuencia que contiene como mínimo un nodo y al menos un valor atómicono es determinista en una consulta en la que el orden es imprevisible.

Ejemplo

Ejemplo con un argumento que es un único valor numérico: la función siguiente devuelve el valorbooleano efectivo 0:v fn:boolean(0)

El valor devuelto es false.

Función fn:compareLa función fn:compare compara dos series.

Sintaxis

�� fn:compare(serie-1,serie-2) ��

serie-1 y serie-2Los valores xs:string que deben compararse. DB2 compara el valor de código Unicode UTF-8numérico de cada carácter. La comparación se realiza de acuerdo con la clasificaciónpredeterminada.

Valor devuelto

Si serie-1 y serie-2 no son secuencias vacías, se devuelve uno de los siguientes valores xs:integer:

-1 Si serie-1 es menor que serie-2.

0 Si serie-1 es igual a serie-2.

1 Si serie-1 es mayor que serie-2.

Dos series se comparan comparando los bytes correspondientes de cada serie. Si las series no tienen lamisma longitud, la comparación se realiza con una copia temporal de la serie más corta que se harellenado por la derecha con blancos para que tenga la misma longitud que la otra serie.

serie-1 y serie-2 son iguales si ambas tienen una longitud de 0 o si todos los bytes correspondientes soniguales.

Si serie-1 y serie-2 no son iguales, su relación (es decir, cuál de ellas tiene el valor mayor) se determinamediante la comparación del primer par de bytes desiguales desde el extremo izquierdo de la series.

Programación SQL XML 193

Page 202: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Si serie-1 es más larga que serie-2, y todos los bytes de serie-2 son iguales a los bytes iniciales de serie-1,serie-1 es mayor que serie-2.

Si serie-1 o serie-2 es una secuencia vacía, se devuelve la secuencia vacía.

Ejemplo

La función siguiente compara 'ABC' con 'ABD' utilizando la clasificación predeterminada.fn:compare(’ABC’, ’ABD’)

'ABC' es menor que 'ABD'. El valor devuelto es -1.

Función fn:concatLa función fn:concat concatena dos o más series en una sola serie.

Sintaxis

��

fn:concat(valor-serie,valor-serie ),

, valor-serie

��

valor-serieUn valor xs:string o la secuencia vacía.

Valor devuelto

Si todos los argumentos valor-serie son la secuencia vacía, el valor devuelto es la secuencia vacía. De locontrario, el valor devuelto es un valor xs:string que es la concatenación de todos los argumentosvalor-serie que no son la secuencia vacía.

Ejemplo

La función siguiente concatena las series 'ABC', 'ABD', la secuencia vacía y 'ABE':fn:concat(’ABC’, ’ABD’, (), ’ABE’)

El valor devuelto es 'ABCABDABE'.

Función fn:containsLa función fn:contains determina si una serie contiene una subserie determinada.

Sintaxis

�� fn:contains(serie,subserie) ��

serie La serie en la que debe buscarse la subserie.

La serie tiene el tipo de datos xs:string o es la secuencia vacía. Si serie es la secuencia vacía, seriese establece en una serie de longitud 0.

subserieLa subserie que debe buscarse en la serie.

La subserie tiene el tipo de datos xs:string o es la secuencia vacía.

194 IBM i: Programación SQL XML

Page 203: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Valor devuelto

El valor devuelto depende de los valores de serie y subserie:v Si serie y subserie no son la secuencia vacía, el valor devuelto es true si subserie aparece en cualquier

lugar dentro de la serie. Si subserie no aparece dentro de la serie, el valor devuelto es false.v Si serie es la secuencia vacía, el valor devuelto es true si subserie es la secuencia vacía o una serie de

longitud 0.v Si subserie es la secuencia vacía o una serie de longitud 0, el valor devuelto es true.

Ejemplo

La función siguiente determina si la serie 'Literal de prueba' contiene la serie 'lite'.fn:contains(’Literalde prueba’,’lite’)

El valor devuelto es true.

Función fn:countLa función fn:count devuelve el número de valores de una secuencia.

Sintaxis

�� fn:count(expresión-secuencia) ��

expresión-secuenciaUna secuencia que contiene elementos de cualquier tipo atómico o una secuencia vacía.

Valor devuelto

Si expresión-secuencia no es la secuencia vacía, se devuelve un valor xs:integer que es el número de valoresde expresión-secuencia. Si expresión-secuencia es la secuencia vacía, se devuelve 0.

Ejemplo

La función siguiente devuelve 1:fn:count(5)

La función siguiente devuelve el número de empleados con el ID de departamento K55:fn:count(//company/emp[dept/@id="K55"])

Función fn:current-dateLa función fn:current-date devuelve la fecha actual en el huso horario implícito de UTC.

Sintaxis

�� fn:current-date() ��

Valor devuelto

El valor devuelto es un valor xs:date que es la fecha actual.

Programación SQL XML 195

Page 204: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo

La función siguiente devuelve la fecha actual.fn:current-date()

Si esta función se hubiera invocado el 2 de diciembre de 2009, el valor devuelto sería 2009-12-02Z.

Función fn:current-dateTimeLa función fn:current-dateTime devuelve la fecha y hora actuales en el huso horario implícito de UTC.

Sintaxis

�� fn:current-dateTime() ��

Valor devuelto

El valor devuelto es un valor xs:dateTime que es la fecha y hora actual.

Ejemplo

La función siguiente devuelve la fecha y hora actuales.fn:current-dateTime()

Si esta función se hubiera invocado el 2 de diciembre de 2009 a las 6:25 en Toronto (huso horario -PT5H),el valor devuelto podría ser 2009-12-02T11:25:30.864001Z.

Función db2-fn:current-local-dateLa función db2-fn:current-local-date función devuelve la fecha actual en el huso horario local.

Sintaxis

�� db2-fn:current-local-date() ��

Valor devuelto

El valor devuelto es un valor xs:date que es la fecha actual. El valor devuelto no incluye un componentede huso horario.

Ejemplo

La función siguiente devuelve la fecha actual.db2-fn:current-local-date()

Si esta función se hubiera invocado el 2 de diciembre de 2009 a las 3:00 hora media de Greenwich (GMT)y el huso horario local fuera Hora estándar oriental (-PT5H), el valor devuelto sería 2009-12-01.

Función db2-fn:current-local-dateTimeLa función db2-fn:current-local-dateTime función devuelve la fecha y hora actuales en el huso horariolocal.

Sintaxis

196 IBM i: Programación SQL XML

Page 205: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

�� db2-fn:current-local-dateTime() ��

Valor devuelto

El valor devuelto es un valor xs:dateTime que es la fecha y hora actual. El valor devuelto no incluye uncomponente de huso horario.

Ejemplo

La función siguiente devuelve la fecha y hora actuales.db2-fn:current-local-dateTime()

Si esta función se hubiera invocado en cualquier lugar el 2 de diciembre de 2009 a las 6:25 hora local, elvalor devuelto sería 2009-12-02T06:25:30.864001.

Función db2-fn:current-local-timeLa función db2-fn:current-local-time función devuelve la hora actual en el huso horario local.

Sintaxis

�� db2-fn:current-local-time() ��

Valor devuelto

El valor devuelto es un valor xs:time que es la hora actual. El valor devuelto no incluye un componentede huso horario.

Ejemplo

La función siguiente devuelve la hora actual.db2-fn:current-local-time()

Si esta función se hubiera invocado a las 6:31 hora media de Greenwich (GMT) y el huso horario localfuera Hora estándar oriental (-PT5H), el valor devuelto sería 01:31:35.519001.

Función fn:current-timeLa función fn:current-time función devuelve la hora actual en el huso horario implícito de UTC.

Sintaxis

�� fn:current-time() ��

Valor devuelto

El valor devuelto es un valor xs:time que es la hora actual.

Ejemplo

La función siguiente devuelve la hora actual.fn:current-time()

Programación SQL XML 197

Page 206: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Si esta función se hubiera invocado a las 6:31 hora media de Greenwich, el valor devuelto sería06:31:35.519001Z.

Función fn:dataLa función fn:data convierte una secuencia de elementos a una secuencia de valores atómicos.

Sintaxis

�� fn:data(secuencia) ��

secuenciaCualquier secuencia, incluida la secuencia vacía.

Valores devueltos

El valor devuelto es una secuencia de elementos de tipo xs:anyAtomicType. Para cada elemento de lasecuencia:v Si el elemento es un valor atómico, el valor devuelto es ese valor.v Si el elemento es un nodo, el valor devuelto es el valor con tipo del nodo.

Ejemplo

La función siguiente devuelve los valores con tipo de todos los nodos name de calificación. Los nodosname de calificación son todos los nodos name que son hijos de un nodo billTo en el documento.fn:data(//billTo/name)

Función fn:dateTimeLa función fn:dateTime construye un valor xs:dateTime a partir de un valor xs:date y un valor xs:time.

Sintaxis

�� fn:dateTime(valor-fecha,valor-hora) ��

valor-fechaUn valor xs:date.

valor-horaUn valor xs:time.

Valor devuelto

El valor devuelto es un valor xs:dateTime con un componente de fecha igual a valor-fecha y uncomponente de hora igual a valor-hora. El huso horario del resultado se calcula como sigue:v Si ningún argumento contiene un huso horario, el resultado no tiene ningún huso horario.v Si exactamente uno de los argumentos contiene un huso horario, o si ambos argumentos tienen el

mismo huso horario, el resultado tiene este huso horario.v Si los dos argumentos contienen husos horarios diferentes, se devuelve un error.

Ejemplo

La función siguiente devuelve un valor xs:dateTime a partir de un valor xs:date y un valor xs:time.fn:dateTime((xs:date("2009-04-16")), (xs:time("12:30:59")))

El valor devuelto es el valor xs:dateTime 2009-04-16T12:30:59.

198 IBM i: Programación SQL XML

Page 207: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Función fn:day-from-dateLa función fn:day-from-date función devuelve el componente de día de un valor xs:date que se encuentraen su formato localizado.

Sintaxis

�� fn:day-from-date(valor-fecha) ��

valor-fechaEl valor de fecha del que debe extraerse el componente de día.

valor-fecha es de tipo xs:date o es una secuencia vacía.

Valor devuelto

Si valor-fecha es de tipo xs:date, el valor devuelto es de tipo xs:integer y está entre 1 y 31, ambos inclusive.El valor es el componente de día de valor-fecha.

Si valor-fecha es una secuencia vacía, el valor devuelto es una secuencia vacía.

Ejemplo

La función siguiente devuelve el componente de día del valor de fecha para el 1 de Junio de 2009.fn:day-from-date(xs:date("2009-06-01"))

El valor devuelto es 1.

Función fn:day-from-dateTimeLa función fn:day-from-dateTime devuelve el componente de día de un valor xs:dateTime que seencuentra en su formato localizado.

Sintaxis

�� fn:day-from-dateTime(valor-fecha-hora) ��

valor-fecha-horaEl valor dateTime del que debe extraerse el componente de día.

valor-fecha-hora es de tipo xs:dateTime o es una secuencia vacía.

Valor devuelto

Si valor-fecha-hora es de tipo xs:dateTime, el valor devuelto es de tipo xs:integer y está entre 1 y 31, ambosinclusive. El valor es el componente de día de valor-fecha-hora.

Si valor-fecha-hora es una secuencia vacía, el valor devuelto es una secuencia vacía.

Ejemplo

La función siguiente devuelve el componente de día del valor de dateTime para el 31 de enero de 2009 alas 8:00 p.m. en el huso horario UTC+4.fn:day-from-dateTime(xs:dateTime("2009-01-31T20:00:00+04:00"))

El valor devuelto es 31.

Programación SQL XML 199

Page 208: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Función fn:days-from-durationLa función fn:days-from-duration devuelve el componente de días de una duración.

Sintaxis

�� fn:days-from-duration(valor-duración) ��

valor-duraciónEl valor de duración del que debe extraerse el componente de días.

valor-duración es una secuencia vacía o un valor que tiene uno de los tipos siguientes:xs:dayTimeDuration, xs:duration o xs:yearMonthDuration.

Valor devuelto

El valor de retorno depende del tipo de valor-duración:v Si valor-duración es de tipo xs:dayTimeDuration o es de tipo xs:duration, el valor devuelto es de tipo

xs:integer, y es el componente de días de la conversión de valor-duración como xs:dayTimeDuration. Elvalor devuelto es negativo si valor-duración es negativo.

v Si valor-duración es de tipo xs:yearMonthDuration, el valor devuelto es 0.v Si valor-duración es una secuencia vacía, el valor devuelto es una secuencia vacía.

El componente de días de la conversión de valor-duración como xs:dayTimeDuration es el número enterode días calculado como (S idiv 86400). El valor S es el número total de segundos de la conversión devalor-duración como xs:dayTimeDuration para eliminar los componentes de años y meses.

Ejemplos

Esta función devuelve el componente de días de la duración -10 días y 0 horas.fn:days-from-duration(xs:dayTimeDuration("-P10DT00H"))

El valor devuelto es -10.

Esta función devuelve el componente de días de la duración 3 días y 55 horas.fn:days-from-duration(xs:dayTimeDuration("P3DT55H"))

El valor devuelto es 5. Al calcular el número total de días de la duración, 55 horas se convierte en 2 díasy 7 horas. La duración es igual a P5D7H, que tiene un componente de días de 5 días.

Función fn:distinct-valuesLa función fn:distinct-values devuelve los valores diferenciados de una secuencia.

Sintaxis

�� fn:distinct-values(expresión-secuencia) ��

expresión-secuenciaUna secuencia de valores atómicos o la secuencia vacía. Los elementos de la secuencia pueden serde cualquiera de los tipos siguientes:v Numéricov Seriev Tipos de fecha, hora o duración

200 IBM i: Programación SQL XML

Page 209: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Valor devuelto

Si expresión-secuencia no es la secuencia vacía, el valor devuelto es una secuencia que contiene los valoresdiferenciados de expresión-secuencia. Los tipos de los elementos de la secuencia de resultados coincidencon los tipos de la secuencia de entrada. Dos elementos son diferenciados si no son iguales entre sí.XPath utiliza las reglas siguientes para obtener una secuencia de valores diferenciados:v Si dos valores no se puede comparar, dichos valores se consideran diferenciados.v Los valores de tipo xs:untypedAtomic se comparan siguiendo las reglas para tipos xs:string.v El orden en el que se devuelve la secuencia de valores puede no ser el mismo que el orden de entrada.v Se devuelve el primer valor de un conjunto de valores que se comparan como iguales.v Si expresión-secuencia es la secuencia vacía, se devuelve la secuencia vacía.v Para valores xs:double, cero positivo es igual a cero negativo.v Si expresión-secuencia contiene varios valores NaN, se devuelve un único valor NaN.

Ejemplo

El ejemplo siguiente devuelve los valores diferenciados del nodo b:<x xmlns="http://posample.org">

<b>1</b><b>a</b><b>1.0</b><b>A</b><b>1</b></x>

declare default element namespace "http://posample.org";fn:distinct-values($d/x/b)

El resultado es ("1", "a", "1.0", "A").

Función fn:existsLa función fn:exists puede comprobar la existencia de muchos tipos distintos de elementos, comoelementos, atributos, nodos de texto, valores atómicos (por ejemplo, un entero) o documentos XML. Si laexpresión especificada como argumento produce un resultado vacío (la secuencia vacía), fn:existsdevuelve false. Si el argumento no devuelve nada excepto la secuencia vacía, fn:exists devuelve true.

Sintaxis

�� fn:exists(expresión-secuencia) ��

expresión-secuenciaCualquier secuencia de cualquier tipo, o la secuencia vacía.

Valor devuelto

El valor devuelto es true si expresión-secuencia no es la secuencia vacía. Si expresión-secuencia produce lasecuencia vacía, el valor devuelto es false.

Ejemplos

Ejemplo 1: Comprobar si hay un elemento customer con un elemento hijo phone. Si existe, la funciónfn:exists devuelve true:fn:exists($info/customer/phone)

Ejemplo 2: Comprobar si hay un elemento customer que tiene un atributo Cid. Si existe, la funciónfn:exists devuelve true:fn:exists($info/customer/@Cid)

Programación SQL XML 201

Page 210: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo 3: Comprobar si el elemento comment tiene un nodo de texto. En este ejemplo, si el elementocomment es un elemento vacío no tiene ningún nodo de texto, por lo que fn:exists devuelve false.Además, si no hay ningún elemento comment en absoluto, fn:exists devuelve false.fn:exists($info/comment/text())

Función fn:hours-from-dateTimeLa función fn:hours-from-dateTime devuelve el componente de horas de un valor xs:dateTime que seencuentra en su formato localizado.

Sintaxis

�� fn:hours-from-dateTime(valor-fecha-hora) ��

valor-fecha-horaEl valor de fecha y hora del que debe extraerse el componente de horas.

valor-fecha-hora es de tipo xs:dateTime o es una secuencia vacía.

Valor devuelto

Si valor-fecha-hora es de tipo xs:dateTime, el valor devuelto es de tipo xs:integer, y el valor está entre 0 y23, ambos inclusive. El valor es el componente de horas de valor-fecha-hora.

Si valor-fecha-hora es una secuencia vacía, el valor devuelto es una secuencia vacía.

Ejemplo

La función siguiente devuelve el componente de horas del valor de fecha y hora para el 31 de enero de2009 a las 2:00 p.m en el huso horario UTC-8.fn:hours-from-dateTime(xs:dateTime("2009-01-31T14:00:00-08:00"))

El valor devuelto es 14.

Función fn:hours-from-durationLa función fn:hours-from-duration devuelve el componente de horas de un valor de duración.

Sintaxis

�� fn:hours-from-duration(valor-duración) ��

valor-duraciónEl valor de duración del que debe extraerse el componente de horas.

valor-duración es una secuencia vacía o un valor que tiene uno de los tipos siguientes:xs:dayTimeDuration, xs:duration o xs:yearMonthDuration.

Valor devuelto

El valor de retorno depende del tipo de valor-duración:v Si valor-duración es de tipo xs:dayTimeDuration o es de tipo xs:duration, el valor devuelto es de tipo

xs:integer, y es un valor entre -23 y 23 inclusive. El valor es el componente de horas de la conversiónde valor-duración como xs:dayTimeDuration. El valor es negativo si valor-duración es negativo.

v Si valor-duración es de tipo xs:yearMonthDuration, el valor devuelto es de tipo xs:integer y es 0.v Si valor-duración es una secuencia vacía, el valor devuelto es una secuencia vacía.

202 IBM i: Programación SQL XML

Page 211: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

El componente de horas de la conversión de valor-duración como xs:dayTimeDuration es el número enterode horas calculado como (S mod 86400) idiv 3600). El valor S es el número total de segundos de laconversión de valor-duración como xs:dayTimeDuration para eliminar los componentes de días y meses. Elvalor 86400 es el número de segundos de un día y 3600 es el número de segundos de una hora.

Ejemplo

La función siguiente devuelve el componente de horas de la duración de 126 horas.fn:hours-from-duration(xs:dayTimeDuration("PT126H"))

El valor devuelto es 6. Al calcular el número total de horas de la duración, 126 horas se convierte en 5días y 6 horas. La duración es igual a P5DT6H, que tiene un componente de horas de 6 horas.

Función fn:hours-from-timeLa función fn:hours-from-time devuelve el componente de horas de un valor xs:time que se encuentra ensu formato localizado.

Sintaxis

�� fn:hours-from-time(valor-hora) ��

valor-horaEl valor de hora del que debe extraerse el componente de horas.

valor-hora es de tipo xs:time o es una secuencia vacía.

Valor devuelto

Si valor-hora no es una secuencia vacía, el valor devuelto es de tipo xs:integer y está entre 0 y 23, ambosinclusive. El valor es el componente de horas de valor-hora.

Si valor-hora es una secuencia vacía, el valor devuelto es una secuencia vacía.

Ejemplo

La función siguiente devuelve el componente de horas del valor de hora 09:30 en el huso horario UTC-8.fn:hours-from-time(xs:time("09:30:00-08:00"))

El valor devuelto es 9.

Función fn:implicit-timezoneLa función fn:implicit-timezone devuelve el huso horario que se utiliza cuando se utiliza un valor defecha, hora o de fecha y hora que no tiene un huso horario en una operación aritmética o decomparación.

El huso horario implícito es el valor de PT0S.

Sintaxis

�� fn:implicit-timezone() ��

Valor devuelto

El valor de huso horario implícito devuelto tiene el tipo xs:dayTimeDuration.

Programación SQL XML 203

Page 212: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo

La función siguiente devuelve xs:dayTimeDuration("PT0S"):fn:implicit-timezone()

Función fn:lastLa función fn:last devuelve el número de valores de la secuencia de elementos que se está procesandoactualmente.

Sintaxis

�� fn:last() ��

Valor devuelto

Si la secuencia que se está procesando actualmente no es la secuencia vacía, el valor devuelto es un valorxs:integer que es el número de valores de la secuencia. Si la secuencia que se está procesandoactualmente es la secuencia vacía, el valor devuelto es la secuencia vacía.

En los casos siguientes, se devuelve un error:v fn:last está separada de su elemento de contexto por "/" o "//".

Por ejemplo, las expresiones siguientes no están soportadas:/a/b/c/fn:last/a/b/[c/fn:last=3]

v El nodo de contexto tiene un eje descendiente o un eje descendiente-o-auto.Por ejemplo, la expresión siguiente no está soportada:/a/b/descendant::c[fn:last()=1]

v El nodo de contexto es una expresión de filtro y ésta tiene un paso con un eje descendiente o un ejedescendiente-o-auto, o una expresión de filtro anidada.Por ejemplo, la expresión siguiente no está soportada:/a/(b/descendant::c)[fn:last()=1]

Ejemplo

En la tabla CUSTOMER de ejemplo, el documento de cliente para el cliente 1003 tiene este aspecto:<customerinfo xmlns="http://posample.org" Cid="1003">

<name>Robert Shoemaker</name><addr country="Canada">

<street>1596 Baseline</street><city>Aurora</city><prov-state>Ontario</prov-state><pcode-zip>N8X-7F8</pcode-zip>

</addr><phone type="work">905-555-7258</phone><phone type="home">416-555-2937</phone><phone type="cell">905-555-8743</phone><phone type="cottage">613-555-3278</phone>

</customerinfo>

La consulta siguiente recupera una fila con un valor XML para el último número de teléfono deldocumento. La consulta utiliza la función fn:last para determinar el número de elementos de número deteléfono, y luego utiliza el resultado de fn:last para que apunte al último número de teléfono.

204 IBM i: Programación SQL XML

Page 213: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

SELECT X.* FROM CUSTOMER, XMLTABLE(’declare default element namespace "http://posample.org";

$D/customerinfo/phone[fn:last()]’PASSING CUSTOMER.INFO AS "D") X WHERE CID=1003

La fila devuelta contiene una única columna XML con un valor de <phone type="cottage">613-555-3278</phone>.

Función fn:local-nameLa función fn:local-name devuelve la propiedad de nombre local de un nodo.

Sintaxis

�� fn:local-name( )nodo

��

nodo El nodo para el que debe recuperarse el nombre local. Si no se especifica nodo, fn:local-name seevalúa para el nodo de contexto actual.

Valor devuelto

El valor devuelto es un valor xs:string. El valor depende de si se especifica nodo y del valor de nodo:v Si no se especifica nodo, se devuelve el nombre local del nodo de contexto.v Si nodo cumple alguna de las condiciones siguientes, se devuelve una serie de longitud 0:

– nodo es la secuencia vacía.– nodo es un nodo de documento, un comentario o un nodo de texto. Estos nodos no tienen nombre.

v En los casos siguientes, se devuelve un error:– El nodo de contexto no está definido.– El elemento de contexto no es un nodo.– nodo es una secuencia de más de un nodo.

v De lo contrario, se devuelve un valor xs:string que contiene la parte de nombre local del nombreampliado para nodo.

Ejemplos

El ejemplo siguiente devuelve el nombre local para el nodo b.SELECT * FROM XMLTABLE(’fn:local-name($d/x/b)’

PASSING XMLPARSE(DOCUMENT’<x><b><c></c></b></x>’)AS "d"

COLUMNS RESULTNAME VARCHAR(100) PATH ’http://posample.org’) X

El valor devuelto es "b".

El ejemplo siguiente muestra que fn:localname() sin argumentos devuelve el nodo de contexto.

En una tabla CUSTOMER de ejemplo, el documento de cliente para el cliente 1001 tiene este aspecto:<customerinfo xmlns="http://posample.org" Cid="1001">

<name>Kathy Smith</name><addr country="Canada">

<street>25 EastCreek</street><city>Markham</city><prov-state>Ontario</prov-state>

Programación SQL XML 205

Page 214: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

<pcode-zip>N9C 3T6</pcode-zip></addr><phone type="work">905-555-7258</phone>

</customerinfo>

El ejemplo siguiente devuelve el nombre local del nodo de contexto.SELECT XV.* FROM CUSTOMER,

XMLTABLE(XMLNAMESPACES(DEFAULT ’http://posample.org’),’$X/customerinfo/*[fn:last()]/fn:local-name()’PASSING CUSTOMER.INFO AS "X")COLUMNS LOCALNAME CLOB(1K) PATH ’.’) XV

WHERE CID=1001

El valor devuelto es "phone".

Función db2-fn:local-timezonela función db2-fn:local-timezone devuelve el huso horario del sistema local.

Sintaxis

�� db2-fn:local-timezone() ��

Valor devuelto

El valor devuelto es un valor xs:dayTimeDuration que representa el desplazamiento del huso horariolocal con respecto a la Hora Universal Coordinada (UTC).

Ejemplo

La función siguiente devuelve el huso horario local.db2-fn:local-timezone()

Si invoca esta función en el huso horario local de Hora estándar oriental, el valor devuelto es -PT5HI.

Función fn:lower-caseLa función fn:lower-case convierte una serie a letras minúsculas.

Sintaxis

�� fn:lower-case(serie-origen) ��

serie-origenLa serie que debe convertirse a minúsculas.

La serie-origen es de tipo xs:string o es la secuencia vacía.

Valor devuelto

Si serie-origen no es la secuencia vacía, el valor devuelto es un valor xs:string que es serie-origen, en la quecada carácter se convierte a la minúscula correspondiente. Cada carácter que no tiene una minúsculacorrespondiente se incluye en el valor devuelto en su formato original.

Si serie-origen es la secuencia vacía, el valor devuelto es una serie de longitud cero.

206 IBM i: Programación SQL XML

Page 215: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo

La función siguiente convierte la serie "Wireless Router TB2561" a minúsculas:fn:lower-case("Wireless Router TB2561")

El valor devuelto es "wireless router tb2561".

Función fn:matchesLa función fn:matches determina si una serie coincide con un determinado patrón.

Sintaxis

�� fn:matches(serie-origen,patrón ),distintivos

��

serie-origenUna serie que se compara con un patrón.

La serie-origen es una serie literal o una expresión XPath que se resuelve en un valor xs:string o lasecuencia vacía.

patrón Una expresión regular que se compara con serie-origen. Una expresión regular es un conjunto decaracteres, caracteres comodín y operadores que definen una serie o grupo de series en un patrónde búsqueda.

El patrón es literal de serie.

distintivosUn literal de serie que puede contener cualquiera de los siguientes valores, que controlan lacoincidencia de patrón con serie-origen:

s Indica que el punto (.) coincide con cualquier carácter.

Si no se especifica el distintivo s, el punto (.) coincide con cualquier carácter excepto elcarácter de nueva línea (#x0A).

m Indica que el signo de intercalación (^) coincide con el inicio de cualquier línea (laposición después de un carácter de nueva línea) y el signo de dólar ($) coincide con elfinal de cualquier línea (la posición antes de que un carácter de nueva línea).

Si no se especifica el distintivo m, el signo de intercalación (^) coincide con el inicio de laserie entera, y el signo de dólar ($) coincide con el final de la serie entera.

i Indica que la comparación no es sensible a las mayúsculas y minúsculas para las letras"a" a "z" y "A" a "Z".

Si no se especifica el distintivo i, se realiza una comparación sensible a las mayúsculas yminúsculas.

x Indica que los caracteres de espacio en blanco (#x09, #x0A, #x0D y #x20) del patrón seignoran, a menos que estén dentro de una clase de carácter. Los caracteres de espacio enblanco en una clase de carácter nunca se ignoran.

Si no se especifica el distintivo x, los caracteres de espacio en blanco se utilizan para lacomparación.

Valor devuelto

Si serie-origen no es la secuencia vacía, el valor devuelto es un valor xs:boolean que es true si serie-origencoincide con patrón. El valor de retorno es false si serie-origen no coincide con patrón.

Programación SQL XML 207

Page 216: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Las normas de coincidencia son las siguientes:v Si patrón no contiene el carácter de intercalación de inicio de serie o inicio de línea (^) o el signo de

dólar ($) de final de serie o final de línea, serie-origen coincide con patrón si cualquier subserie deserie-origen coincide con patrón.

v Si patrón contiene el carácter de intercalación (^) de inicio de serie o inicio de línea, serie-origen coincidecon patrón sólo si serie-origen coincide con patrón desde el principio de serie-origen o desde el principiode una línea de serie-origen.

v Si patrón contiene el carácter de signo de dólar ($) de fin de serie o fin de línea, serie-origen coincide conpatrón sólo si serie-origen coincide con patrón al final de serie-origen o al final de una línea de serie-origen.

v El distintivo m determina:– Si se produce una coincidencia desde el principio de la serie o desde el principio de una línea– Si se produce una coincidencia desde el final de la serie o desde el final de una línea.

Si serie-origen es la secuencia vacía, serie-origen se considera una serie de longitud 0, y serie-origen coincidecon patrón si patrón coincide con una serie de longitud 0.

Ejemplos

Ejemplo de coincidencia de un patrón con cualquier subserie dentro de una serie: la función siguientedetermina si las series "ac" o "bd" aparecen en cualquier lugar de la serie "abbcacadbdcd".fn:matches("abbcacadbdcd","(ac)|(bd)")

El valor devuelto es true.

Ejemplo de coincidencia de un patrón con una serie entera: la función siguiente determina si las series"ac" o "bd" coinciden con la serie "bd". El carácter de intercalación (^) y el carácter del signo de dólar ($)indican que la coincidencia debe empezar al principio de la serie de origen y terminar al final de la seriede origen.fn:matches("bd","^(ac)|(bd)$")

El valor devuelto es true.

Función fn:maxLa función fn:max devuelve el máximo de los valores de una secuencia.

Sintaxis

�� fn:max(expresión-secuencia) ��

expresión-secuenciaLa secuencia vacía o una secuencia en la que todos los elementos son de uno de los tipossiguientes:v Numéricov Seriev xs:datev xs:dateTimev xs:timev xs:dayTimeDurationv xs:yearMonthDuration

208 IBM i: Programación SQL XML

Page 217: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Los elementos de entrada de tipo xs:untypedAtomic se convierten a xs:double. Los elementos deentrada numéricos se convierten al tipo menos común que se puede comparar mediante unacombinación de promoción de tipo y sustitución de subtipo.

Valor devuelto

Si expresión-secuencia no es la secuencia vacía, el valor devuelto es un valor de tipo xs:anyAtomicType quees el máximo de los valores de expresión-secuencia. El tipo de datos del valor devuelto es el mismo que eltipo de datos de los elementos de expresión-secuencia, o el tipo de datos común al que se promocionan loselementos de expresión-secuencia.

Si expresión-secuencia contiene un elemento, se devuelve ese elemento. Si expresión-secuencia es la secuenciavacía, se devuelve la secuencia vacía. Si la secuencia incluye el valor NaN, se devuelve NaN.

Ejemplo

La consulta siguiente devuelve una sola fila que contiene un valor de tipo double que es el máximo de lasecuencia (500, 1.0E2, 40.5).SELECT * FROMXMLTABLE (XMLNAMESPACES (DEFAULT ’http://posample.org’),

’$d’PASSING XMLPARSE(DOCUMENT ’<x xmlns="http://posample.org">

<b>500</b><b>1.0E2</b><b>40.5</b></x>’) AS "d"COLUMNS RES DOUBLE PATH ’fn:max(x/b)’) X

Los valores se promocionan al tipo de datos xs:double. La función devuelve el valor xs:double 5.0E2, queluego se convierte al tipo de datos SQL double.

Función fn:minLa función fn:min devuelve el valor mínimo de los valores de una secuencia.

Sintaxis

�� fn:min(expresión-secuencia) ��

expresión-secuenciaLa secuencia vacía o una secuencia en la que todos los elementos son de uno de los tipossiguientes:v Numéricov Seriev xs:datev xs:dateTimev xs:timev xs:dayTimeDurationv xs:yearMonthDuration

Los elementos de entrada de tipo xs:untypedAtomic se convierten a xs:double. Los elementos deentrada numéricos se convierten al tipo menos común que se puede comparar mediante unacombinación de promoción de tipo y sustitución de subtipo.

Programación SQL XML 209

Page 218: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Valor devuelto

Si expresión-secuencia no es la secuencia vacía, el valor devuelto es un valor de tipo xs:anyAtomicType quees el mínimo de los valores de expresión-secuencia. El tipo de datos del valor devuelto es el mismo que eltipo de datos de los elementos de expresión-secuencia, o el tipo de datos común al que se promocionan loselementos de expresión-secuencia.

Si expresión-secuencia contiene un elemento, se devuelve ese elemento. Si expresión-secuencia es la secuenciavacía, se devuelve la secuencia vacía. Si la secuencia incluye el valor NaN, se devuelve NaN.

Ejemplo

La consulta siguiente devuelve el mínimo de la secuencia (500, 1.0E2, 40.5).SELECT * FROMXMLTABLE (XMLNAMESPACES (DEFAULT ’http://posample.org’),

’$d’PASSING XMLPARSE(DOCUMENT ’<x xmlns="http://posample.org">

<b>500</b><b>1.0E2</b><b>40.5</b></x>’) AS "d"COLUMNS RES DOUBLE PATH ’fn:min(x/b)’) X

Los valores se promocionan al tipo de datos xs:double. La función devuelve el valor xs:double 4.05E1,que luego se convierte al tipo de datos SQL double.

Función fn:minutes-from-dateTimeLa función fn:minutes-from-dateTime devuelve el componente de minutos de un valor xs:dateTime que seencuentra en su formato localizado.

Sintaxis

�� fn:minutes-from-dateTime(valor-dateTime) ��

valor-dateTimeEl valor dateTime del que debe extraerse el componente de minutos.

valor-fecha-hora es de tipo xs:dateTime o es una secuencia vacía.

Valor devuelto

Si valor-fecha-hora es de tipo xs:dateTime, el valor devuelto es de tipo xs:integer, y el valor está entre 0 y59, ambos inclusive. El valor es el componente de minutos de valor-fecha-hora.

Si valor-fecha-hora es una secuencia vacía, el valor devuelto es una secuencia vacía.

Ejemplo

La función siguiente devuelve el componente de minutos del valor de fecha y hora del 23 de enero de2009 a las 09:42 a.m. en el huso horario UTC-8.fn:minutes-from-dateTime(xs:dateTime("2009-01-23T09:42:00-08:00"))

El valor devuelto es 42.

Función fn:minutes-from-durationLa función fn:minutes-from-duration devuelve el componente de minutos de una duración.

210 IBM i: Programación SQL XML

Page 219: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Sintaxis

�� fn:minutes-from-duration(valor-duración) ��

valor-duraciónEl valor de duración del que debe extraerse el componente de minutos.

valor-duración es una secuencia vacía o un valor que tiene uno de los tipos siguientes:xs:dayTimeDuration, xs:duration o xs:yearMonthDuration.

Valor devuelto

El valor de retorno depende del tipo de valor-duración:v Si valor-duración es de tipo xs:dayTimeDuration o xs:duration, el valor devuelto es de tipo xs:integer y

es un valor entre -59 y 59, ambos inclusive. El valor es el componente de minutos de la conversión devalor-duración como xs:dayTimeDuration. El valor es negativo si valor-duración es negativo.

v Si valor-duración es de tipo xs:yearMonthDuration, el valor devuelto es 0.v Si valor-duración es una secuencia vacía, el valor devuelto es una secuencia vacía.

El componente de minutos de la conversión de valor-duración como xs:dayTimeDuration es el númeroentero de minutos calculado como ((S mod 3600) idiv 60). El valor S es el número total de segundos dela conversión de valor-duración como xs:dayTimeDuration para eliminar los componentes de años ymeses.

Ejemplo

La función siguiente devuelve el componente de minutos de la duración 2 días, 16 horas y 93 minutos.fn:minutes-from-duration(xs:dayTimeDuration("P2DT16H93M"))

El valor devuelto es 33. Al calcular el número total de minutos de la duración, 93 minutos se conviertenen 1 hora y 33 minutos. La duración es igual a P2DT17H33M, que tiene un componente de minutos de 33minutos.

Función fn:minutes-from-timeLa función fn:minutes-from-time devuelve el componente de minutos de un valor xs:time que seencuentra en su formato localizado.

Sintaxis

�� fn:minutes-from-time(valor-hora) ��

valor-horaEl valor de hora del que debe extraerse el componente de minutos.

valor-hora es de tipo xs:time o es una secuencia vacía.

Valor devuelto

Si valor-hora es de tipo xs:time, el valor devuelto es de tipo xs:integer y está entre 0 y 59, ambos inclusive.El valor es el componente de minutos de valor-hora.

Si valor-hora es una secuencia vacía, el valor devuelto es una secuencia vacía.

Programación SQL XML 211

Page 220: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo

La función siguiente devuelve el componente de minutos del valor de hora 8:59 a.m. en el huso horarioUTC-8.fn:minutes-from-time(xs:time("08:59:00-08:00"))

El valor devuelto es 59.

Función fn:month-from-dateLa función fn:month-from-date devuelve el componente de mes de un valor xs:date que se encuentra ensu formato localizado.

Sintaxis

�� fn:month-from-date(valor-fecha) ��

valor-fechaEl valor de fecha del que debe extraerse el componente de mes.

valor-fecha es de tipo xs:date o es una secuencia vacía.

Valor devuelto

Si valor-fecha es de tipo xs:date, el valor devuelto es de tipo xs:integer y está entre 1 y 12, ambos inclusive.El valor es el componente de mes de valor-fecha.

Si valor-fecha es una secuencia vacía, el valor devuelto es una secuencia vacía.

Ejemplo

La función siguiente devuelve el componente de mes del valor de fecha 1 de diciembre de 2009.fn:month-from-date(xs:date("2009-12-01"))

El valor devuelto es 12.

Función fn:month-from-dateTimeLa función fn:month-from-dateTime devuelve el componente de mes de un valor xs:dateTime que seencuentra en su formato localizado.

Sintaxis

�� fn:month-from-dateTime(valor-fecha-hora) ��

valor-fecha-horaEl valor de fecha y hora del que debe extraerse el componente de mes.

valor-fecha-hora es de tipo xs:dateTime o es una secuencia vacía.

Valor devuelto

Si valor-fecha-hora es de tipo xs:dateTime, el valor devuelto es de tipo xs:integer y está entre 1 y 12, ambosinclusive. El valor es el componente de mes de valor-fecha-hora.

Si valor-fecha-hora es una secuencia vacía, el valor devuelto es una secuencia vacía.

212 IBM i: Programación SQL XML

Page 221: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo

La función siguiente devuelve el componente de mes del valor de fecha y hora 31 de octubre de 2009 alas 08:15 a.m. en el huso horario UTC-8.fn:month-from-dateTime(xs:dateTime("2009-10-31T08:15:00-08:00"))

El valor devuelto es 10.

Función fn:months-from-durationLa función fn:months-from-duration devuelve el componente de meses de un valor de duración.

Sintaxis

�� fn:months-from-duration(valor-duración) ��

valor-duraciónEl valor de duración del que debe extraerse el componente de meses.

valor-duración es una secuencia vacía o un valor que tiene uno de los tipos siguientes:xs:dayTimeDuration, xs:duration o xs:yearMonthDuration.

Valor devuelto

El valor de retorno depende del tipo de valor-duración:v Si valor-duración es de tipo xs:duration o xs:yearMonthDuration, el valor devuelto es de tipo xs:integer,

y es un valor entre -11 y 11, ambos inclusive. El valor es el componente de meses de la conversión devalor-duración como xs:yearMonthDuration. El valor es negativo si valor-duración es negativo.

v Si valor-duración es de tipo xs:dayTimeDuration, el valor devuelto es 0.v Si valor-duración es una secuencia vacía, el valor devuelto es una secuencia vacía.

El componente de meses de la conversión de valor-duración como xs:yearMonthDuration es el númeroentero de meses restantes del número total de meses de valor-duración dividido por 12.

Ejemplos

La función siguiente devuelve el componente de meses de la duración 20 años y 5 meses.fn:months-from-duration(xs:duration("P20Y5M"))

El valor devuelto es 5.

La función siguiente devuelve el componente meses del valor yearMonthDuration -9 años y -13 meses.fn:months-from-duration(xs:yearMonthDuration("-P9Y13M"))

El valor devuelto es -1. Al calcular el número total de meses de la duración, -13 meses se convierte en -1año y -1 meses. La duración es igual a -P10Y1M, que tiene un componente de meses de -1 mes.

La función siguiente devuelve el componente de meses de la duración 14 años, 11 meses, 40 días y 13horas.xquery fn:months-from-duration(xs:duration("P14Y11M40DT13H"))

El valor devuelto es 11.

Función fn:nameLa función fn:name devuelve los componentes de prefijo y nombre local de un nombre de nodo.

Programación SQL XML 213

Page 222: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Sintaxis

�� fn:name( )nodo

��

nodo El nombre calificado de un nodo cuyo nombre debe recuperarse. Si no se especifica nodo, fn:namese evalúa para el nodo de contexto actual.

Valor devuelto

El valor devuelto es un valor xs:string. El valor depende del valor de nodo:v Si nodo cumple alguna de las condiciones siguientes, se devuelve una serie de longitud 0:

– nodo es la secuencia vacía.– nodo es un nodo de documento, un comentario o un nodo de texto. Estos nodos no tienen nombre.

v En los casos siguientes, se devuelve un error:– El nodo de contexto no está definido.– El elemento de contexto no es un nodo.– nodo es una secuencia de más de un nodo.

v De lo contrario, se devuelve un valor xs:string que contiene el prefijo (si está presente) y el nombrelocal de nodo.

Ejemplo

El ejemplo siguiente devuelve una fila que contiene una columna CLOB que contiene el nombrecalificado de cada nodo b.SELECT * FROMXMLTABLE ( ’declare namespace ns1="http://posample.org";

$d/x/ns1:b/fn:name(.)’PASSING XMLPARSE(DOCUMENT

’<x xmlns:n="http://posample.org"><n:b><n:c></n:c></n:b></x>’)

AS "d")COLUMNS COL1 CLOB(1K) PATH(.) ) X

El valor devuelto es "n:b".

El ejemplo siguiente muestra que fn:name() sin argumentos devuelve el nodo de contexto.

En la tabla CUSTOMER de muestra, el documento de cliente para el cliente 1001 es el siguiente:<customerinfo xmlns="http://posample.org" Cid="1001">

<name>Kathy Smith</name><addr country="Canada">

<street>25 EastCreek</street><city>Markham</city><prov-state>Ontario</prov-state><pcode-zip>N9C 3T6</pcode-zip>

</addr><phone type="work">905-555-7258</phone>

</customerinfo>

El ejemplo siguiente devuelve el nombre calificado del nodo de contexto.SELECT * FROM CUSTOMER,XMLTABLE(’declare default element namespace "http://posample.org";

$X/customerinfo/phone/fn:name()’PASSING INFO AS "X")COLUMNS RESULT1 CLOB(1K) PATH ’.’) X

WHERE CID=1001

214 IBM i: Programación SQL XML

Page 223: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

El valor devuelto es "phone".

Función fn:normalize-spaceLa función fn:normalize-space elimina los caracteres de espacio en blanco iniciales y finales de una serie ysustituye varios caracteres de espacio en blanco consecutivos de la serie por un único carácter en blanco.

Sintaxis

�� fn:normalize-space( )serie-origen

��

serie-origenUna serie en la que deben normalizarse los espacios en blanco.

serie-origen es un valor xs:string o la secuencia vacía.

Si no se especifica serie-origen, el argumento de fn:normalize-space es el elemento de contextoactual, que se convierte a un valor xs:string mediante la función fn:string.

Valor devuelto

El valor devuelto es el valor xs:string que se genera cuando se realizan las operaciones siguientes enserie-origen:v Los caracteres de espacio en blanco iniciales y finales se eliminan.v Cada secuencia interna de uno o varios caracteres de espacio en blanco adyacentes se sustituye por un

solo carácter de espacio (U+0020).

Los caracteres de espacio en blanco son el carácter de espacio (U+0020), el retorno de carro, (U+000D), elsalto de línea (U+000A) y el tabulador (U+0009).

Si serie-origen es la secuencia vacía, se devuelve una serie de longitud 0.

Ejemplo

La función siguiente elimina los caracteres de espacio en blanco que sobran de la serie "a b c d ".fn:normalize-space(" a b c d " )

El valor devuelto es "a b c d".

Función fn:notLa función fn:not devuelve false si el valor booleano efectivo de una expresión de secuencia es true. fn:nodevuelve true si el valor booleano efectivo de una expresión de secuencia es false.

Sintaxis

�� fn:not(expresión-secuencia) ��

expresión-secuenciaCualquier secuencia que contenga elementos de cualquier tipo, o la secuencia vacía.

Valor devuelto

El valor devuelto es un valor xs:boolean. Si el valor booleano efectivo de expresión-secuencia es false, estafunción devuelve true. Si el valor booleano efectivo de expresión-secuencia es true, esta función devuelvefalse.

Programación SQL XML 215

Page 224: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo

La función siguiente devuelve true:fn:not("a"="b")

La función siguiente devuelve false:fn:not("false")

Función fn:positionLa función fn:position devuelve la posición del elemento de contexto en la secuencia que se estáprocesando actualmente.

La función position se utiliza en un predicado. Sin embargo, también puede utilizarse para generar laposición de cada aparición de su elemento de contexto.

Sintaxis

�� fn:position() ��

Valor devuelto

El valor devuelto es un valor xs:integer que indica la posición del elemento de contexto en la secuenciaque se está procesando actualmente. El primer elemento de la secuencia tiene la posición 1. Si el elementode contexto no está definido, se devuelve un error. La función position devuelve un resultadodeterminista sólo si la secuencia que contiene el elemento de contexto tiene un orden determinista.

En los casos siguientes, se devuelve un error:v El paso de contexto es el eje descendiente o descendiente-o-autov El contexto es una secuencia de valores atómicosv fn:position aparece como parte de una expresión de filtro anidada dentro de un predicado. I

$x/a[$y/c/fn:position()] $x/a[(b/c)[2]]

Ejemplos

La consulta siguiente devuelve una fila que contiene una columna XML con el segundo elemento de lasecuencia de elementos <c> en el documento.<x xmlns="http://posample.org"><b><c>x</c><c>y</c><c>z</c></b></x>

SELECT * FROMXMLTABLE(XMLNAMESPACES(DEFAULT ’http://posample.org’),

’$d/x/b/c[fn:position()=2]’PASSING XMLPARSE(DOCUMENT ’<x xmlns="http://posample.org">

<b><c>x</c><c>y</c><c>z</c></b></x>’) AS "d"COLUMNS RESULT XML PATH ’.’) X

El valor devuelto es <c>y</c>.

La consulta siguiente devuelve la posición de cada aparición de <a><b><c> como un único valor XML.SELECT * FROM

XMLTABLE(’.’PASSING XMLPARSE(DOCUMENT

’<a><b><c>c1</c></b><b><c>c2</c><c>c3</c></b></a>’)COLUMNS RESULT_POS XML PATH ’/a/b/c/fn:position()’) X

El valor devuelto es "1 2 3".

216 IBM i: Programación SQL XML

Page 225: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Función fn:replaceLa función fn:replace compara cada conjunto de caracteres de una serie con un patrón determinado.fn:replace sustituye los caracteres que coinciden con el patrón por otro conjunto de caracteres.

Sintaxis

�� fn:replace(serie-origen,patrón,serie-sustitución ),distintivos

��

serie-origenUna serie que contiene caracteres que deben sustituirse.

La serie-origen es una serie literal o una expresión Xpath que se resuelve en un valor xs:string o lasecuencia vacía.

patrón Una expresión regular que se compara con serie-origen. Una expresión regular es un conjunto decaracteres, caracteres comodín y operadores que definen una serie o grupo de series en un patrónde búsqueda.

El patrón es un literal de serie.

serie-sustituciónUna serie que contiene caracteres que sustituyen a los caracteres que coinciden con el patrón de laserie-origen.

La serie-sustitución es un valor xs:string. Un símbolo $ literal debe escribirse como \$. Un símbolo\ literal debe escribirse como \\.

distintivosUn literal de serie que puede contener cualquiera de los siguientes valores, que controlan lacoincidencia de patrón con serie-origen:

s Indica que el punto (.) coincide con cualquier carácter.

Si no se especifica el distintivo s, el punto (.) coincide con cualquier carácter excepto elcarácter de nueva línea (#x0A).

m Indica que el signo de intercalación (^) coincide con el inicio de cualquier línea (laposición después de un carácter de nueva línea) y el signo de dólar ($) coincide con elfinal de cualquier línea (la posición antes de que un carácter de nueva línea).

Si no se especifica el distintivo m, el signo de intercalación (^) coincide con el inicio de laserie entera, y el signo de dólar ($) coincide con el final de la serie entera.

i Indica que la comparación no es sensible a las mayúsculas y minúsculas para las letras"a" a "z" y "A" a "Z".

Si no se especifica el distintivo i, se realiza una comparación sensible a las mayúsculas yminúsculas.

x Indica que los caracteres de espacio en blanco (#x09, #x0A, #x0D y #x20) del patrón seignoran, a menos que estén dentro de una clase de carácter. Los caracteres de espacio enblanco en una clase de carácter nunca se ignoran.

Si no se especifica el distintivo x, los caracteres de espacio en blanco se utilizan para lacomparación.

Valor devuelto

Si serie-origen no es la secuencia vacía, el valor devuelto es un valor xs:string que se genera cuando serealizan las operaciones siguientes en una copia de serie-origen:v Se buscan en serie-origen caracteres que coincidan con patrón.

Programación SQL XML 217

Page 226: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

– Si dos subseries solapadas de serie-origen coinciden con patrón, se considera que sólo la subserie cuyoprimer carácter está situado antes en serie-origen coincide con patrón.

– Si patrón contiene dos o más conjuntos de caracteres alternativos y éstos coinciden con los caracteresque empiezan en la misma posición de serie-origen, se considera que el primer conjunto de caracteresde patrón que coincide con los caracteres de serie-origen coincide con patrón.

v Cada conjunto de caracteres de serie-origen que coincide con patrón se sustituye por serie-sustitución.

Si patrón no se encuentra en serie-origen, se devuelve serie-origen.

Si patrón coincide con una serie de longitud cero, se devuelve un error.

Si serie-origen es la secuencia vacía, se devuelve una serie de longitud 0.

Ejemplo

La función siguiente sustituye todas las instancias de "a" seguido de cualquier carácter único o "b"seguido de cualquier carácter único por "*@".fn:replace("abbcacadbdcd","(a(.))|(b(.))","*@")

El valor devuelto es "*@*@*@*@*@cd".

Función fn:roundLa función fn:round devuelve el entero más cercano al valor numérico especificado.

Sintaxis

�� fn:round(valor-numérico) ��

valor-numéricoUn valor atómico o una secuencia vacía.

Si valor-numérico es un valor atómico, tiene uno de los tipos siguientes:v xs:doublev xs:decimalv xs:integerv Un tipo derivado de cualquiera de los tipos listados anteriormente

Valor devuelto

Si valor-numérico no es la secuencia vacía, el valor devuelto es el entero más cercano a valor-numérico. Eltipo de datos del valor devuelto depende del tipo de datos de valor-numérico:v Si valor-numérico es xs:double, xs:decimal o xs:integer, el valor que se devuelve tiene el mismo tipo que

valor-numérico.v Si valor-numérico tiene un tipo de datos derivado de xs:double, xs:decimal o xs:integer, el valor que se

devuelve tiene el tipo de datos padre directo de valor-numérico.

Si valor-numérico es la secuencia vacía, el valor devuelto es la secuencia vacía.

Ejemplos

Ejemplo con un argumento positivo: La función siguiente devuelve el valor redondeado de 0.5:fn:round(0.5)

El valor devuelto es 1.

218 IBM i: Programación SQL XML

Page 227: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo con un argumento negativo: La función siguiente devuelve el valor redondeado de (-1.5):fn:round(-1.5)

El valor devuelto es -1.

Función fn:seconds-from-dateTimeLa función fn:seconds-from-dateTime devuelve el componente de segundos de un valor xs:dateTime quese encuentra en su formato localizado.

Sintaxis

�� fn:seconds-from-dateTime(valor-fecha-hora) ��

valor-fecha-horaEl valor de fecha y hora del que debe extraerse el componente de segundos.

valor-fecha-hora es de tipo xs:dateTime o es una secuencia vacía.

Valor devuelto

Si valor-fecha-hora es de tipo xs:dateTime, el valor devuelto es de tipo xs:decimal y es superior o igual a 0y menor que 60. El valor es el componente de segundos y fracciones de segundo de valor-fecha-hora.

Si valor-fecha-hora es una secuencia vacía, el valor devuelto es una secuencia vacía.

Ejemplos

La función siguiente devuelve el componente de segundos del valor de fecha y hora para el 8 de febrerode 2009 a las 2:16:23 p.m. en el huso horario UTC-8.fn:seconds-from-dateTime(xs:dateTime("2009-02-08T14:16:23-08:00"))

El valor devuelto es 23.

La función siguiente devuelve el componente de segundos del valor de fecha y hora para el 23 de juniode 2009 a las 9:16:20.43 a.m. en el huso horario UTC.fn:seconds-from-dateTime(xs:dateTime("2009-06-23T09:16:20.43Z"))

El valor devuelto es 20.43.

Función fn:seconds-from-durationLa función fn:seconds-from-duration devuelve el componente de segundos de una duración.

Sintaxis

�� fn:seconds-from-duration(valor-duración) ��

valor-duraciónEl valor de duración del que debe extraerse el componente de segundos.

valor-duración es una secuencia vacía o un valor que tiene uno de los tipos siguientes:xs:dayTimeDuration, xs:duration o xs:yearMonthDuration.

Valor devuelto

El valor de retorno depende del tipo de valor-duración:

Programación SQL XML 219

Page 228: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v Si valor-duración es de tipo xs:dayTimeDuration o xs:duration, el valor devuelto es de tipo xs:decimal, yes un valor superior a -60 e inferior a 60. El valor es el componente de segundos y fracciones desegundo de la conversión de valor-duración como xs:dayTimeDuration. El valor es negativo sivalor-duración es negativo.

v Si valor-duración es de tipo xs:yearMonthDuration, el valor devuelto es de tipo xs:integer y es 0.v Si valor-duración es una secuencia vacía, el valor devuelto es una secuencia vacía.

El componente de segundos y fracciones de segundo de la conversión de valor-duración comoxs:dayTimeDuration se calcula como (S mod 60). El valor S es el número total de segundos y fraccionesde segundo de la conversión de valor-duración como xs:dayTimeDuration para eliminar los componentesde años y meses.

Ejemplo

La función siguiente devuelve el componente de segundos de la duración 150.5 segundos.fn:seconds-from-duration(xs:dayTimeDuration("PT150.5S"))

El valor devuelto es 30.5. Al calcular el número total de segundos de la duración, 150.5 segundos seconvierte en 2 minutos y 30.5 segundos. La duración es igual a PT2M30.5S, que tiene un componente desegundos de 30.5 segundos.

Función fn:seconds-from-timeLa función fn:seconds-from-time devuelve el componente de segundos de un valor xs:time que seencuentra en su formato localizado.

Sintaxis

�� fn:seconds-from-time(valor-hora) ��

valor-horaEl valor de hora del que debe extraerse el componente de segundos.

valor-hora es de tipo xs:time o es una secuencia vacía.

Valor devuelto

Si valor-hora es de tipo xs:time, el valor devuelto es de tipo xs:decimal y es superior o igual a cero einferior a 60. El valor es el componente de segundos y fracciones de segundo de valor-hora.

Si valor-hora es una secuencia vacía, el valor devuelto es una secuencia vacía.

Ejemplo

La función siguiente devuelve el componente de segundos del valor de hora 08:59:59 a.m. en el husohorario UTC-8.fn:seconds-from-time(xs:time("08:59:59-08:00"))

El valor devuelto es 59.

Función fn:starts-withLa función fn:starts-with determina si una serie empieza por una subserie determinada. La subserie secompara utilizando la clasificación predeterminada.

220 IBM i: Programación SQL XML

Page 229: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Sintaxis

�� fn:starts-with(serie,subserie) ��

serie La serie en la que debe buscarse la subserie.

La serie tiene el tipo de datos xs:string o es la secuencia vacía. Si serie es la secuencia vacía, seriese establece en una serie de longitud 0.

subserieLa subserie que buscar.

La subserie tiene el tipo de datos xs:string o es la secuencia vacía.

Valor devuelto

El valor devuelto es el valor xs:boolean true si se cumple alguna de las condiciones siguientes:v La subserie aparece al principio de la serie.v La subserie es una secuencia vacía o una serie de longitud cero.

De lo contrario, el valor devuelto es false.

Ejemplo

La función siguiente determina si la serie 'Test literal' empieza por la serie 'lite'.fn:starts-with(’Test literal’,’lite’)

El valor devuelto es false.

Función fn:stringLa función fn:string devuelve la representación de serie de un valor.

Sintaxis

�� fn:string( )valor

��

valor El valor que debe representarse como una serie.

valor es un nodo o un valor atómico, o es la secuencia vacía.

Si no se especifica valor, fn:string se evalúa para el elemento de contexto actual. Si el elemento decontexto actual no está definido, se devuelve un error.

Valor devuelto

Si valor no es la secuencia vacía, se devuelve un valor xs:string:v Si valor es un nodo, el valor devuelto es la propiedad de valor de serie del nodo valor.v Si valor es un valor atómico, el valor devuelto es el resultado de la conversión de valor a xs:string.

Si valor es la secuencia vacía, el resultado es una serie de longitud 0.

Ejemplo

La función siguiente devuelve la representación de serie de 123:fn:string(xs:integer(123))

Programación SQL XML 221

Page 230: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

El valor devuelto es '123'.

Función fn:string-lengthLa función fn:string-length devuelve la longitud de una serie.

Sintaxis

�� fn:string-length( )serie-origen

��

serie-origenLa serie cuya longitud debe devolverse.

La serie-origen tiene el tipo de datos xs:string o es una secuencia vacía.

Valor devuelto

Si serie-origen no es la secuencia vacía, el valor devuelto es un valor xs:integer que es el número decaracteres de serie-origen.

Si serie-origen es la secuencia vacía, el valor devuelto es el valor xs:integer 0.

Si no se especifica serie-origen, el argumento de fn:string-length toma de forma predeterminada el valor deserie del elemento de contexto. Si el elemento de contexto no está definido, se produce un error.

Ejemplo

La función siguiente devuelve la longitud de la serie "Test literal".fn:string-length("Test literal")

El valor devuelto es 12.

Función fn:substringLa función fn:substring devuelve una subserie de una serie.

Sintaxis

�� fn:substring(serie-origen,inicio ),longitud

��

serie-origenLa serie de la que se recupera la subserie.

La serie-origen tiene el tipo de datos xs:string o es una secuencia vacía.

inicio La posición inicial de la subserie en la serie-origen. La primera posición de serie-origen es 1. Siinicio<=0, inicio se establece en 1.

inicio tiene el tipo de datos xs:double.

longitudLa longitud de la subserie. El valor predeterminado de longitud es la longitud de serie-origen. Siinicio+longitud-1 es mayor que la longitud de serie-origen, longitud se establece en (longitud deserie-origen)-inicio+1.

longitud tiene el tipo de datos xs:double.

222 IBM i: Programación SQL XML

Page 231: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Valor devuelto

Si serie-origen no es la secuencia vacía, el valor devuelto es un valor xs:string que es la subserie deserie-origen que se inicia en la posición de inicio y tiene una longitud en bytes. Si serie-origen es la secuenciavacía, el resultado es una serie de longitud 0.

Ejemplo

La siguiente función devuelve siete caracteres a partir del sexto carácter de la serie 'Test literal'.fn:substring(’Test literal’,6,7)

El valor devuelto es 'literal'.

Función fn:sumLa función fn:sum devuelve la suma de los valores de una secuencia.

Sintaxis

�� fn:sum(expresión-secuencia) ��

expresión-secuenciaUna secuencia que contiene elementos de cualquiera de los siguientes tipos atómicos, o unasecuencia vacía:v xs:doublev xs:decimalv xs:integerv Un tipo derivado de cualquiera de los tipos listados anteriormentev xs:dayTimeDurationv xs:yearMonthDurationv xs:untypedAtomic

Todos los valores de la secuencia deben ser del mismo tipo o de un tipo derivado del tipo, odeben ser promocionables a un solo tipo común. Un valor xs:untypedAtomic se promociona altipo de datos xs:double. Un tipo derivado se promociona a su tipo de datos padre directo.

Valor devuelto

Si expresión-secuencia no es la secuencia vacía, el valor devuelto es la suma de los valores deexpresión-secuencia. El tipo de datos del valor devuelto es el mismo que el tipo de datos de los elementosde expresión-secuencia, o el tipo de datos al que se promocionan los elementos de expresión-secuencia.

Si expresión-secuencia es la secuencia vacía, fn:sum devuelve 0.0E0.

Ejemplo

La función siguiente devuelve la suma de la secuencia (500, 1.0E2, 40.5):fn:sum((500, 1.0E2, 40.5))

Los valores se promocionan al tipo de datos xs:double. El valor devuelto es 6.405E2.

Función fn:timezone-from-dateLa función fn:timezone-from-date devuelve el componente de huso horario de un valor xs:date.

Programación SQL XML 223

Page 232: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Sintaxis

�� fn:timezone-from-date(valor-fecha) ��

valor-fechaEl valor de fecha del que debe extraerse el componente de huso horario.

valor-fecha es de tipo xs:date o es una secuencia vacía.

Valor devuelto

Si valor-fecha es de tipo xs:date y tiene un componente de huso horario explícito, el valor devuelto es detipo xs:dayTimeDuration y está entre -PT14H y PT14H, ambos inclusive. El valor es la desviación delcomponente de huso horario de valor-fecha con respecto al huso horario UTC.

Si valor-fecha no tiene un componente de huso horario explícito o es una secuencia vacía, el valor devueltoes una secuencia vacía.

Ejemplo

La función siguiente devuelve el componente de huso horario del valor de fecha 13 de marzo de 2009 enel huso horario UTC-8.fn:timezone-from-date(xs:date("2009-03-13-08:00"))

El valor devuelto es -PT8H.

Función fn:timezone-from-dateTimeLa función fn:timezone-from-dateTime devuelve el componente de huso horario de un valor xs:dateTime.

Sintaxis

�� fn:timezone-from-dateTime(valor-fecha-hora) ��

valor-fecha-horaEl valor de fecha y hora del que debe extraerse el componente de huso horario.

valor-fecha-hora es de tipo xs:dateTime o es una secuencia vacía.

Valor devuelto

Si valor-fecha-hora es de tipo xs:dateTime y tiene un componente de huso horario explícito, el valordevuelto es de tipo xs:dayTimeDuration y está entre -PT14H y PT14H, ambos inclusive. El valor es ladesviación del componente de huso horario de valor-fecha-hora con respecto al huso horario UTC.

Si valor-fecha-hora no tiene un componente de huso horario explícito o es una secuencia vacía, el valordevuelto es una secuencia vacía.

Ejemplos

La función siguiente devuelve el componente de huso horario del valor de fecha y hora para el 30 deoctubre de 2009 a las 07:30 a.m. en el huso horario UTC-8.fn:timezone-from-dateTime(xs:dateTime("2009-10-30T07:30:00-08:00"))

El valor devuelto es -PT8H.

224 IBM i: Programación SQL XML

Page 233: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

La función siguiente devuelve el componente de huso horario del valor de fecha y hora para el 1 deenero de 2009 a las 2:30 p.m. en el huso horario UTC+10:30.fn:timezone-from-dateTime(xs:dateTime("2009-01-01T14:30:00+10:30"))

El valor devuelto es PT10H30M.

Función fn:timezone-from-timeLa función fn:timezone-from-time devuelve el componente de huso horario de un valor xs:time.

Sintaxis

�� fn:timezone-from-time(valor-hora) ��

valor-horaEl valor de hora del que debe extraerse el componente de huso horario.

valor-hora es de tipo xs:time o es una secuencia vacía.

Valor devuelto

Si valor-hora es de tipo xs:time y tiene un componente de huso horario explícito, el valor devuelto es detipo xs:dayTimeDuration y está entre -PT14H y PT14H, ambos inclusive. El valor es la desviación delcomponente de huso horario de valor-hora con respecto al huso horario UTC.

Si valor-hora no tiene un componente de huso horario explícito o es una secuencia vacía, el valor devueltoes una secuencia vacía.

Ejemplos

La función siguiente devuelve el componente de huso horario del valor de hora 12 del mediodía en elhuso horario UTC-5.fn:timezone-from-time(xs:time("12:00:00-05:00"))

El valor devuelto es -PT5H.

En la función siguiente, el valor de hora 1:00 p.m. no tiene componente de huso horario.fn:timezone-from-time(xs:time("13:00:00"))

El valor devuelto es la secuencia vacía.

Función fn:tokenizeLa función fn:tokenize divide una serie en una secuencia de subseries.

Sintaxis

�� fn:tokenize( serie-origen , patrón ), distintivos

��

serie-origenUna serie que debe dividirse en una secuencia de subseries.

La serie-origen es una serie literal o una expresión XPath que se resuelve en un valor xs:string o lasecuencia vacía.

patrón El delimitador entre subseries de serie-origen.

Programación SQL XML 225

Page 234: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

El patrón es un literal de serie que contiene una expresión regular. Una expresión regular es unconjunto de caracteres, caracteres comodín y operadores que definen una serie o grupo de seriesen un patrón de búsqueda.

distintivosUn literal de serie que puede contener cualquiera de los siguientes valores, que controlan lacoincidencia de patrón con serie-origen:

s Indica que el punto (.) coincide con cualquier carácter.

Si no se especifica el distintivo s, el punto (.) coincide con cualquier carácter excepto elcarácter de nueva línea (#x0A).

m Indica que el signo de intercalación (^) coincide con el inicio de cualquier línea (laposición después de un carácter de nueva línea) y el signo de dólar ($) coincide con elfinal de cualquier línea (la posición antes de que un carácter de nueva línea).

Si no se especifica el distintivo m, el signo de intercalación (^) coincide con el inicio de laserie entera, y el signo de dólar ($) coincide con el final de la serie entera.

i Indica que la comparación no es sensible a las mayúsculas y minúsculas para las letras"a" a "z" y "A" a "Z".

Si no se especifica el distintivo i, se realiza una comparación sensible a las mayúsculas yminúsculas.

x Indica que los caracteres de espacio en blanco (#x09, #x0A, #x0D y #x20) del patrón seignoran, a menos que estén dentro de una clase de carácter. Los caracteres de espacio enblanco en una clase de carácter nunca se ignoran.

Si no se especifica el distintivo x, los caracteres de espacio en blanco se utilizan para lacomparación.

Valor devuelto

Si serie-origen no es la secuencia vacía o una serie de longitud cero, el valor devuelto es una secuencia devalores xs:string que se genera cuando se realizan las operaciones siguientes en serie-origen:v Se buscan en serie-origen los caracteres que coinciden con patrón.v Si patrón contiene dos o más conjuntos de caracteres alternativos y éstos coinciden con los caracteres

que empiezan en la misma posición de serie-origen, se considera que el primer conjunto de caracteresde patrón que coincide con los caracteres de serie-origen coincide con patrón.

v Cada conjunto de caracteres que no coincide con patrón se convierte en un elemento de la secuencia deresultados.

v Si patrón coincide con los caracteres del principio de serie-origen, el primer elemento de la secuenciadevuelta es una serie de longitud 0.

v Si se encuentran dos coincidencias sucesivas para patrón en serie-origen, se añade a la secuencia unaserie de longitud 0.

v Si patrón coincide con caracteres del final de serie-origen, el último elemento de la secuencia devuelta esuna serie de longitud 0.

Si patrón no se encuentra en serie-origen, se devuelve serie-origen.

Si patrón coincide con una serie de longitud cero, se devuelve un error.

Si serie-origen es la secuencia vacía o es una serie de longitud cero, el resultado es la secuencia vacía.

226 IBM i: Programación SQL XML

Page 235: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo

La función siguiente crea una secuencia de la serie "?A?B?C?D?" eliminando los caracteres de signo deinterrogación (?) y creando una secuencia del resto de caracteres.fn:tokenize("?A?B?C?D?","\?")

El valor devuelto es la secuencia ("", "A", "B", "C", "D", "").

Función fn:translateLa función fn:translate sustituye los caracteres seleccionados de una serie por caracteres de sustitución.

Sintaxis

�� fn:translate(serie-origen,serie-original,serie-sustitución) ��

serie-origenLa serie cuyos caracteres deben convertirse.

La serie-origen tiene el tipo de datos xs:string o es la secuencia vacía.

serie-originalUna serie que contiene los caracteres que pueden convertirse.

serie-original tiene el tipo de datos xs:string.

serie-sustituciónUna serie que contiene los caracteres que sustituyen a los caracteres de serie-original.

serie-sustitución tiene el tipo de datos xs:string.

Si la longitud de serie-sustitución es mayor que la longitud de serie-original, los caracteresadicionales de serie-sustitución se ignoran.

Valor devuelto

Si serie-origen no es la secuencia vacía, el valor devuelto es el valor xs:string que se genera cuando serealizan las operaciones siguientes:v Para cada carácter de serie-origen que aparece en serie-original, sustituir el carácter de serie-origen por el

carácter de serie-sustitución que aparece en la misma posición que el carácter de serie-original.Si la longitud de serie-original es mayor que la longitud de serie-sustitución, suprimir cada uno de loscaracteres de serie-origen que aparezca en serie-original, pero la posición del carácter en serie-original notiene una posición correspondiente en serie-sustitución.Si un carácter aparece más de una vez en serie-original, la posición de la primera aparición del carácteren serie-original determina el carácter de serie-sustitución que se utiliza.

v Para cada carácter de serie-origen que no aparece en serie-original, dejar el carácter tal como está.

Si serie-origen es la secuencia vacía, se devuelve una serie de longitud 0.

Ejemplo

La función siguiente sustituye el carácter a por el carácter A y suprime los caracteres - de la serie"—aaa—".fn:translate("---aaa---","a-","A")

El valor devuelto es "AAA".

Programación SQL XML 227

Page 236: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Función fn:upper-caseLa función fn:upper-case convierte una serie a mayúsculas.

Sintaxis

�� fn:upper-case(serie-origen) ��

serie-origenLa serie que se convertirá a mayúsculas.

La serie-origen tiene el tipo de datos xs:string o es una secuencia vacía.

Valor devuelto

Si serie-origen no es una secuencia vacía, el valor devuelto es el valor xs:string serie-origen, con cada unode los caracteres convertidos a su mayúscula correspondiente. Cada carácter que no tiene una mayúsculascorrespondiente se incluye en el valor devuelto en su formato original.

Si serie-origen es la secuencia vacía, el valor devuelto es una serie de longitud cero.

Ejemplos

La siguiente función convierte la serie 'Test literal 1' a mayúsculas.fn:upper-case("Test literal 1")

El valor devuelto es "TEST LITERAL 1".

El argumento de la función siguiente se resuelve en "ii".fn:upper-case("&#x131;i")

El valor devuelto es "II".

Función fn:year-from-dateLa función fn:year-from-date devuelve el componente de año de un valor xs:date en el que se encuentraen su formato localizado.

Sintaxis

�� fn:year-from-date(valor-fecha) ��

valor-fechaEl valor de fecha del que debe extraerse el componente de año.

valor-fecha es de tipo xs:date o es una secuencia vacía.

Valor devuelto

Si valor-fecha es de tipo xs:date, el valor devuelto es de tipo xs:integer. El valor es el componente de añodel valor-fecha, un valor no negativo.

Si valor-fecha es una secuencia vacía, el valor devuelto es una secuencia vacía.

228 IBM i: Programación SQL XML

Page 237: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Ejemplo

La función siguiente devuelve el componente de año del valor de fecha 29 de octubre de 2009.fn:year-from-date(xs:date("2009-10-29"))

El valor devuelto es 2009.

Función fn:year-from-dateTimeLa función fn:year-from-dateTime devuelve el componente de año de un valor xs:dateTime que seencuentra en su formato localizado.

Sintaxis

�� fn:year-from-dateTime(valor-fecha-hora) ��

valor-fecha-horaEl valor de fecha y hora del que debe extraerse el componente de año.

valor-fecha-hora es de tipo xs:dateTime o es una secuencia vacía.

Valor devuelto

Si valor-fecha-hora es de tipo xs:dateTime, el valor devuelto es de tipo xs:integer. El valor es el componentede año del valor-fecha-hora, un valor no negativo.

Si valor-fecha-hora es una secuencia vacía, el valor devuelto es una secuencia vacía.

Ejemplo

La función siguiente devuelve el componente de año del valor de fecha y hora para 29 de octubre de2009 a las 08:00 a.m. en el huso horario UTC-8.fn:year-from-dateTime(xs:dateTime("2009-10-29T08:00:00-08:00"))

El valor devuelto es 2009.

Función fn:years-from-durationLa función fn:years-from-duration devuelve el componente de años de una duración.

Sintaxis

�� fn:years-from-duration(valor-duración) ��

valor-duraciónEl valor de duración del que debe extraerse el componente de años.

valor-duración es una secuencia vacía o un valor que tiene uno de los tipos siguientes:xs:dayTimeDuration, xs:duration o xs:yearMonthDuration.

Valor devuelto

El valor de retorno depende del tipo de valor-duración:v Si valor-duración es de tipo xs:yearMonthDuration o xs:duration, el valor devuelto es de tipo xs:integer.

El valor es el componente de años de la conversión de valor-duración como xs:yearMonthDuration. Elvalor es negativo si valor-duración es negativo.

v Si valor-duración es de tipo xs:dayTimeDuration, el valor devuelto es de tipo xs:integer y es 0.

Programación SQL XML 229

Page 238: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

v Si valor-duración es una secuencia vacía, el valor devuelto es una secuencia vacía.

El componente de años de la conversión de valor-duración como xs:yearMonthDuration es el númeroentero de años determinado por el número total de meses de la conversión de valor-duración comoxs:yearMonthDuration dividido por 12.

Ejemplos

La función siguiente devuelve el componente de años de la duración -4 años, -11 meses y -320 días.fn:years-from-duration(xs:duration("-P4Y11M320D"))

El valor devuelto es -4.

La función siguiente devuelve el componente de años de la duración 9 años y 13 meses.fn:years-from-duration(xs:yearMonthDuration("P9Y13M"))

El valor devuelto es 10. Al calcular el número total de años de la duración, 13 meses se convierte en 1año y 1 mes. La duración es igual a P10Y1M, que tiene un componente de años de 10 años.

Información sobre licencia de código y exención de responsabilidadIBM le otorga una licencia de copyright no exclusiva para utilizar todos los ejemplos de código deprogramación, a partir de los que puede generar funciones similares adaptadas a sus necesidadesespecíficas.

SUJETO A LAS GARANTÍAS ESTATUTARIAS QUE NO PUEDAN EXCLUIRSE, IBM Y LOSDESARROLLADORES Y SUMINISTRADORES DE PROGRAMAS DE IBM NO OFRECEN NINGUNAGARANTÍA NI CONDICIÓN, YA SEA IMPLÍCITA O EXPLÍCITA, INCLUIDAS, PERO SIN LIMITARSE AELLAS, LAS GARANTÍAS O CONDICIONES IMPLÍCITAS DE COMERCIALIZACIÓN, ADECUACIÓNA UN PROPÓSITO DETERMINADO Y NO VULNERACIÓN CON RESPECTO AL PROGRAMA O ALSOPORTE TÉCNICO, SI EXISTE.

BAJO NINGUNA CIRCUNSTANCIA, IBM Y LOS DESARROLLADORES O SUMINISTRADORES DEPROGRAMAS DE IBM SE HACEN RESPONSABLES DE NINGUNA DE LAS SIGUIENTESSITUACIONES, NI SIQUIERA EN CASO DE HABER SIDO INFORMADOS DE TAL POSIBILIDAD:1. PÉRDIDA DE DATOS O DAÑOS CAUSADOS EN ELLOS;2. DAÑOS ESPECIALES, ACCIDENTALES, DIRECTOS O INDIRECTOS, O DAÑOS ECONÓMICOS

DERIVADOS;3. PÉRDIDAS DE BENEFICIOS, COMERCIALES, DE INGRESOS, CLIENTELA O AHORROS

ANTICIPADOS.

ALGUNAS JURISDICCIONES NO PERMITEN LA EXCLUSIÓN O LA LIMITACIÓN DE LOS DAÑOSDIRECTOS, ACCIDENTALES O DERIVADOS, POR LO QUE PARTE DE LAS LIMITACIONES OEXCLUSIONES ANTERIORES, O TODAS ELLAS, PUEDE NO SER PROCEDENTE EN SU CASO.

230 IBM i: Programación SQL XML

Page 239: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Avisos

Esta información se ha escrito para productos y servicios ofrecidos en Estados Unidos de América.

Es posible que IBM no ofrezca en otros países los productos, servicios o características que se describenen este documento. Consulte con el representante local de IBM para obtener información acerca de losproductos y servicios que actualmente están disponibles en su zona. Las referencias a programas,productos o servicios de IBM no pretenden establecer ni implicar que sólo puedan utilizarse dichosproductos, programas o servicios de IBM. En su lugar, se puede utilizar cualquier producto, programa oservicio funcionalmente equivalente que no infrinja ninguno de los derechos intelectuales de IBM. Noobstante, es responsabilidad del usuario evaluar y verificar el funcionamiento de cualquier producto,programa o servicio que no sea de IBM.

IBM puede tener patentes o solicitudes de patentes pendientes que cubran la materia descrita en estedocumento. La posesión de este documento no le otorga ninguna licencia sobre dichas patentes. Puedeenviar consultas sobre licencias, por escrito, a:

IBM Director of LicensingIBM CorporationNorth Castle DriveArmonk, NY 10504-1785EE.UU.

Para consultas sobre licencias relacionadas con información de doble byte (DBCS), póngase en contactocon el Departamento de propiedad intelectual de IBM de su país o envíe consultas, por escrito, a:

Intellectual Property LicensingLegal and Intellectual Property LawIBM Japan Ltd.1623-14, Shimotsuruma, Yamato-shiKanagawa 242-8502 Japón

El párrafo siguiente no se aplica al Reino Unido ni a ningún otro país donde estas disposiciones seanincompatibles con la legislación local: INTERNATIONAL BUSINESS MACHINES CORPORATIONPROPORCIONA ESTA PUBLICACIÓN "TAL CUAL" SIN GARANTÍAS DE NINGÚN TIPO, NIEXPLÍCITAS NI IMPLÍCITAS, INCLUYENDO PERO NO LIMITÁNDOSE A ELLAS, LAS GARANTÍASIMPLÍCITAS DE NO VULNERACIÓN, COMERCIALIZACIÓN O IDONEIDAD PARA UN FINCONCRETO. Algunas legislaciones no contemplan la declaración de limitación de garantías, ni implícitasni explícitas, en determinadas transacciones, por lo que cabe la posibilidad de que esta declaración no seaaplicable en su caso.

Esta información puede contener imprecisiones técnicas o errores tipográficos. La información incluida eneste documento está sujeta a cambios periódicos, que se incorporarán en nuevas ediciones de lapublicación. IBM puede realizar en cualquier momento mejoras o cambios en los productos o programasdescritos en esta publicación sin previo aviso.

Las referencias hechas en esta publicación a sitios Web que no son de IBM se proporcionan únicamentepor cortesía y de ningún modo deben interpretarse como promoción de dichos sitios Web. Los materialesde dichos sitios Web no forman parte de los materiales de este producto IBM y su utilización esresponsabilidad del usuario.

IBM puede utilizar o distribuir cualquier información que se le proporcione en la forma que considereadecuada, sin incurrir por ello en ninguna obligación para con el remitente.

© Copyright IBM Corp. 2012, 2014 231

Page 240: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Los licenciatarios de este programa que deseen obtener información sobre él para poder: (i) intercambiarinformación entre programas creados de forma independiente y otros programas (incluidos este) y (ii) yutilizar, de forma mutua, la información que se ha intercambiado, deben ponerse en contacto con:

IBM CorporationSoftware Interoperability Coordinator, Department YBWA3605 Highway 52 NRochester, MN 55901EE.UU.

Esta información puede estar disponible, sujeta a los términos y condiciones pertinentes, e incluir enalgunos casos el pago de una cantidad.

El programa bajo licencia descrito en este documento y todo el material con licencia disponible seproporcionan bajo los términos de IBM Customer Agreement, IBM International Program LicenseAgreement o cualquier otro acuerdo equivalente entre IBM y el cliente.

Los datos de rendimiento incluidos aquí se determinaron en un entorno controlado. Por lo tanto, losresultados que se obtengan en otros entornos operativos pueden variar significativamente. Puedenhaberse realizado mediciones en sistemas que estén en fase de desarrollo y no existe ninguna garantía deque esas mediciones vayan a ser iguales en los sistemas disponibles en el mercado. Además, es posibleque algunas mediciones se hayan estimado mediante extrapolación. Los resultados reales pueden variar.Los usuarios de este documento deben verificar los datos aplicables a su entorno específico.

La información concerniente a productos que no son de IBM se ha obtenido de los suministradores dedichos productos, de sus anuncios publicados o de otras fuentes de información pública disponibles. IBMno ha probado esos productos y no puede confirmar la exactitud del rendimiento, de la compatibilidad nide ninguna otra declaración relacionada con productos que no sean de IBM. Las consultas acerca de lasprestaciones de los productos que no son de IBM deben dirigirse a los suministradores de talesproductos.

Todas las declaraciones relativas a la dirección o intención futura de IBM están sujetas a cambios oanulación sin previo aviso y representan únicamente metas y objetivos.

Esta documentación se suministra solo a efectos de planificación. La información que aquí se incluye estásujeta a cambios antes de que los productos descritos estén disponibles.

Esta información contiene ejemplos de datos e informes utilizados en operaciones comerciales diarias.Para ilustrarlas de la forma más completa posible, los ejemplos incluyen nombres de personas, empresas,marcas y productos. Todos estos nombres son ficticios y cualquier parecido con los nombres y direccionesutilizados por una empresa real es pura coincidencia.

LICENCIA DE COPYRIGHT:

Esta información contiene programas de aplicación de ejemplo en lenguaje fuente, que muestran técnicasde programación en diversas plataformas operativas. Puede copiar, modificar y distribuir estos programasde muestra de cualquier modo sin pagar a IBM con el fin de desarrollar, utilizar, comercializar odistribuir programas de aplicación que se ajusten a la interfaz de programación de aplicaciones para laplataforma operativa para la que se ha escrito el código de muestra. Estos ejemplos no se hancomprobado de forma exhaustiva en todas las condiciones. Por lo tanto, IBM no puede garantizar ni darpor supuesta la fiabilidad, la capacidad de servicio ni la funcionalidad de estos programas. Losprogramas de ejemplo se ofrecen "TAL CUAL", sin garantía de ningún tipo. IBM no se hará responsablede los daños derivados de la utilización que haga el usuario de los programas de ejemplo.

Cada copia o parte de estos programas de ejemplo, así como todo trabajo derivado, debe incluir un avisode copyright como el siguiente:

232 IBM i: Programación SQL XML

Page 241: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

© (nombre de su empresa) (año). Partes de este código derivan de programas de ejemplo de IBM Corp.Sample Programs.

© Copyright IBM Corp. _escriba el año o años_.

Información de interfaz de programaciónEsta publicación Programación SQL XML documenta las interfaces de programación previstas quepermiten al cliente escribir programas para obtener los servicios de IBM i.

Marcas registradasIBM, el logotipo de IBM e ibm.com son marcas registradas o marcas comerciales registradas deInternational Business Machines Corp., registradas en muchas jurisdicciones de todo el mundo. Otrosnombres de servicios y productos podrían ser marcas registradas de IBM u otras compañías. Haydisponible una lista actual de marcas registradas de IBM en la web “Información de marca registrada ycopyright” en www.ibm.com/legal/copytrade.shtml.

Adobe, el logotipo de Adobe, PostScript y el logotipo de PostScript son marcas registradas de AdobeSystems Incorporated en los Estados Unidos y/o en otros países.

Linux es una marca registrada de Linus Torvalds en Estados Unidos y/o en otros países.

Microsoft, Windows, Windows NT y el logotipo de Windows con marcas registradas de MicrosoftCorporation en Estados Unidos y/o en otros países.

UNIX es una marca registrada de The Open Group en Estados Unidos y en otros países.

Otros nombres de servicios y productos podrían ser marcas registradas de IBM u otras compañías.

Términos y condicionesLos permisos para utilizar estas publicaciones están sujetos a los siguientes términos y condiciones.

Uso personal: puede reproducir estas publicaciones para uso personal (no comercial) siempre y cuandoincluya una copia de todos los avisos de derechos de autor. No puede distribuir ni visualizar estaspublicaciones ni ninguna de sus partes, como tampoco elaborar trabajos que se deriven de ellas, sin elconsentimiento explícito de IBM.

Uso comercial: puede reproducir, distribuir y visualizar estas publicaciones únicamente dentro de suempresa, siempre y cuando incluya una copia de todos los avisos de derechos de autor. No puedeelaborar trabajos que se deriven de estas publicaciones, ni tampoco reproducir, distribuir ni visualizarestas publicaciones ni ninguna de sus partes fuera de su empresa, sin el consentimiento explícito de IBM.

Aparte de la autorización que se concede explícitamente en este permiso, no se otorga ningún otropermiso, licencia ni derecho, ya sea explícito o implícito, sobre las publicaciones, la información, losdatos, el software o cualquier otra propiedad intelectual contenida en ellas.

IBM se reserva el derecho de retirar los permisos aquí concedidos siempre que, según el parecer delfabricante, se utilicen las publicaciones en detrimento de sus intereses o cuando, también según el parecerdel fabricante, no se sigan debidamente las instrucciones anteriores.

No puede bajar, exportar ni reexportar esta información si no lo hace en plena conformidad con lalegislación y normativa vigente, incluidas todas las leyes y normas de exportación de Estados Unidos.

Avisos 233

Page 242: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

IBM NO PROPORCIONA NINGUNA GARANTÍA SOBRE EL CONTENIDO DE ESTASPUBLICACIONES. LAS PUBLICACIONES SE PROPORCIONAN "TAL CUAL", SIN GARANTÍA DENINGUNA CLASE, YA SEA EXPLÍCITA O IMPLÍCITA, INCLUIDAS, PERO SIN LIMITARSE A ELLAS,LAS GARANTÍAS IMPLÍCITAS DE COMERCIALIZACIÓN, NO VULNERACIÓN E IDONEIDAD PARAUN FIN DETERMINADO.

234 IBM i: Programación SQL XML

Page 243: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

Índice

Aactualizaciones

columnas XML 39de columnas XML 39

almacenar datos XMLactualizar 39codificación 60

consideraciones 60correlaciones de nombre con

CCSID 70inserción 14

visión general 14análisis

explícitoXML 15

implícitoXML 15

análisis de XML explícito 15análisis de XML implícito 15anotaciones

atributos 73globales 73

anotaciones de descomposición XMLámbito 72especificación 72

archivar XML 32atomización 163

CCDATA en la descomposición 107codificación XML

consideracionesen JDBC y SQLJ 61entrada de XML 60para parámetros de rutina 61recuperación de XML 61

efecto sobre la conversión dedatos 62

escenariosentrada de datos codificados

externamente 63entrada de datos codificados

internamente 62recuperación con serialización

explícita 68recuperación con serialización

implícita 65codificación XML interna

consideracionesentrada de XML 60para JDBC y SQLJ 61

escenariosentrada 62

columnas XMLactualizaciones

ejemplos 39añadir 14insertar en 14

visión general 14

comentariosXPath 145

comparacióngenérica 178

compatibilidadtipos de datos

para la descomposición 124constructores

tipos incorporados 147construir XML 17

a partir de filas de tabla 19a partir de una sola tabla 18a partir de varias tablas 19manejo de caracteres especiales 28

conversiones entre tipos de datos delesquema XML

lista 158correlación

columna XMLejemplo 115

Ddatos XML

actualizar 39codificación 60

CCSID con nombres decodificación 70

correlaciones de nombres conCCSID 70

inserción 14visión general 14

modelo 5suprimir 40

declaración de espacio de nombrespredeterminado

XPath 162declaraciones

espacio de nombres 161espacio de nombres

predeterminado 162descomposición de esquemas XML

anotados 70anotaciones

consideraciones 109db2-xdb:column 82db2-xdb:condition 90db2-xdb:contentHandling 93db2-xdb:defaultSQLSchema 74db2-xdb:expression 87db2-xdb:locationPath 84db2-xdb:normalization 97db2-xdb:order 99db2-xdb:rowSet 76db2-xdb:rowSetMapping 103db2-

xdb:rowSetOperationOrder 106db2-xdb:table 80db2-xdb:truncate 101esquema 132resumen 74

descomposición de esquemas XMLanotados (continuación)

anotaciones (continuación)visión general 72

compatibilidad de tipos de datos 124ejemplos 109, 116, 118, 119, 121, 123orígenes 71palabras clave 106procedimiento 71restricciones 131secciones CDATA 107series vacías 107valores NULL 107

descomposición de XMLanotaciones

db2-xdb:column 82db2-xdb:condition 90db2-xdb:contentHandling 93db2-xdb:defaultSQLSchema 74db2-xdb:expression 87db2-xdb:locationPath 84db2-xdb:normalization 97db2-xdb:order 99db2-xdb:rowSet 76db2-xdb:rowSetMapping 103db2-

xdb:rowSetOperationOrder 106db2-xdb:table 80db2-xdb:truncate 101esquema 132orígenes 71resumen 74visión general 72

compatibilidad de tipos de datostipos SQL 124

ejemplosagrupar varios valores

correlacionados con una solatabla 121

correlación con columna XML 115resumen 109valor correlacionado con una sola

tabla que genera una solafila 116

valor correlacionado con una solatabla que genera varias filas 118

valor correlacionado con variastablas 119

varios valores de contextosdiferentes correlacionados conuna sola tabla 123

esquema XML anotado 71lista de comprobación 109palabras clave 106

límites 131palabras clave 106procedimiento 71restricciones 131secciones CDATA 107series vacías 107tipos complejos 109

© Copyright IBM Corp. 2012, 2014 235

Page 244: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

descomposición de XML (continuación)valores NULL 107visión general 70

documentos XMLdescomposición 71diferencias tras almacenamiento y

recuperación 31habilitar 71registrar 71tipos de datos de archivado 32

Eeje

atributo 170auto 170descendiente 170descendiente-o-auto 170hijo 170padre 170

eje auto 170eje de atributo 170eje descendiente 170eje descendiente-o-auto 170eje hijo 170eje padre 170ejemplos

descomposición de XMLagrupar varios valores

correlacionados con una solatabla 121

correlación con columna XML 115resumen 109valor correlacionado con una sola

tabla 116, 118valor correlacionado con varias

tablas 119varios valores de contextos

diferentes correlacionados conuna sola tabla 123

elemento 133espacio en blanco

análisis XML 15XPath 144

espacios de nombresutilización de XSLT para cambiar 25

espacios de nombres XML 146esquema de codificación 145esquema XML

tipos de datos, conversiones 158esquemas

repositorio 40esquemas XML

repositorioreferencia de ubicación de

identificador universal derecursos (URI) 40

visión general 40evaluación de expresiones 163expresión de elemento de contexto 166expresión de filtro 175expresión de vía de acceso

sintaxis abreviada 174expresión regular

descripción 181sintaxis 181

expresión XPathejemplo 161formato general 160

expresionesaritméticas 175atomización 163elemento de contexto 166entre paréntesis 166filtro 175lógicas 179proceso 163promoción de tipo 163sustitución de subtipo 164vía de acceso 167

expresiones aritméticas 175expresiones de comparación

XPath 178

Ffragmentación de XML 70función abs 187función adjust-date-to-timezone 188función adjust-dateTime-to-timezone 189función adjust-time-to-timezone 191función boolean 192función compare 193función concat 194función contains 194función count 195función current-date 195función current-dateTime 196función current-local-date 196función current-local-dateTime 196función current-local-time 197función current-time 197función data 198función dateTime 198función day-from-date 199función day-from-dateTime 199función days-from-duration 200función de agregado XMLGROUP

publicar XML 17función distinct-values 200Función escalar XMLFOREST

publicar XML 17función escalar XMLPARSE

visión general del análisis 15función escalar XMLSERIALIZE

visión general de la serialización 29función exists 201función hours-from-dateTime 202función hours-from-duration 202función hours-from-time 203función implicit-timezone 203función last 204función local-name 205función local-timezone 206función lower-case 206función matches 207función max 208función min 209función minutes-from-dateTime 210función minutes-from-duration 211función minutes-from-time 211función month-from-date 212función month-from-dateTime 212

función months-from-duration 213función name 214función normalize-space 215función not 215función position 216función replace 217función round 218función seconds-from-dateTime 219función seconds-from-duration 219función seconds-from-time 220Función starts-with 221función string 221función string-length 222función substring 222función sum 223función timezone-from-date 224función timezone-from-dateTime 224función timezone-from-time 225función tokenize 225función translate 227función upper-case 228función year-from-date 228función year-from-dateTime 229función years-from-duration 229funciones

abs 187adjust-date-to-timezone 188adjust-dateTime-to-timezone 189adjust-time-to-timezone 191boolean 192compare 193concat 194contains 194count 195current-date 195current-dateTime 196current-local-date 196current-local-dateTime 196current-local-time 197current-time 197data 198dateTime 198day-from-date 199day-from-dateTime 199days-from-duration 200distinct-values 200exists 201función implicit-timezone 203hours-from-dateTime 202hours-from-duration 202hours-from-time 203last 204local-name 205local-timezone 206lower-case 206matches 207max 208min 209minutes-from-dateTime 210minutes-from-duration 211minutes-from-time 211month-from-date 212month-from-dateTime 212months-from-duration 213name 214normalize-space 215not 215

236 IBM i: Programación SQL XML

Page 245: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

funciones (continuación)position 216replace 217round 218seconds-from-dateTime 219seconds-from-duration 219seconds-from-time 220starts-with 221string 221string-length 222substring 222sum 223timezone-from-date 224timezone-from-dateTime 224timezone-from-time 225tokenize 225translate 227upper-case 228year-from-date 228year-from-dateTime 229years-from-duration 229

funciones DB2 Xpathtimezone-from-dateTime 224

funciones XPathabs 187adjust-date-to-timezone 188adjust-dateTime-to-timezone 189adjust-time-to-timezone 191boolean 192compare 193concat 194contains 194count 195current-date 195current-dateTime 196current-local-date 196current-local-dateTime 196current-local-time 197current-time 197data 198dateTime 198day-from-date 199day-from-dateTime 199days-from-duration 200distinct-values 200exists 201función implicit-timezone 203hours-from-dateTime 202hours-from-duration 202hours-from-time 203last 204local-name 205local-timezone 206lower-case 206matches 207max 208min 209minutes-from-dateTime 210minutes-from-duration 211minutes-from-time 211month-from-date 212month-from-dateTime 212months-from-duration 213name 214normalize-space 215not 215position 216

funciones XPath (continuación)replace 217round 218seconds-from-dateTime 219seconds-from-duration 219seconds-from-time 220starts-with 221string 221string-length 222substring 222sum 223timezone-from-date 224timezone-from-dateTime 224timezone-from-time 225tokenize 225translate 227upper-case 228year-from-date 228year-from-dateTime 229years-from-duration 229

Gguías de aprendizaje

XML 7actualizar documentos XML 8creación de una tabla 7insertar documentos XML 7transformar con XSLT 11validar documentos XML 9

Iidentidad

nodo 134identidad de nodo 134insertar datos

XML 14visión general 14

JJava Database Connectivity (JDBC)

XMLcodificación de datos 61

Juego de caracteres 145

Llenguajes de programación

XML 41literal numérico 164literales de serie

XPath 164llamada a función XPath 167llamada de función

XPath 167

Mmodelo de datos

generación 140XML 133

modelo de datos XML 133

Nnodo 134

atributo 138comentario 139documento 136elemento 136instrucción de proceso 139texto 138

nodo de atributo 138nodo de comentario 139nodo de documento 136nodo de elemento 136nodo de instrucción de proceso 139nodo de texto 138nombres calificados (QNames)

XPath 146

Oorden de documento 134ordenación predeterminada 146

Ppalabra clave DECOMP_CONTENT 106palabra clave

DECOMP_DOCUMENTID 106palabra clave

DECOMP_ELEMENTID 106paso

eje 168paso de eje 168predicado XPath 173prólogo

XPath 161prólogo de XPath 161promoción de tipo

XPath 163propiedades

nodo 134propiedades de nodo 134prueba de nodo 171prueba de nombre 171prueba de tipo 171publicación de valores XML

ejemplosfilas de tabla 19una sola tabla 18varias tablas 19

funciones de SQL/XMLmanejo de caracteres

especiales 28resumen 17

Rrecuperación de datos XML

diferencias de documentos 31recuperar datos

XMLconsideraciones sobre la

codificación 61escenarios de codificación 65, 68

referencia de carácter XML 165

Índice 237

Page 246: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

referencia de entidad predefinidaXPath 165

referencias de variablesXPath 166

rendimientoXML

guía de aprendizaje 60rutinas

soporte para XMLconsideraciones sobre la

codificación 61

Ssecuencia 133secuencia de clasificación 146secuencias

atomización 163sensible a las mayúsculas y minúsculas

XPath 144serialización

correlaciones de CCSID con nombresde codificación 70

diferencias en documento XML 31efecto sobre la conversión de

datos 62explícita 29implícita 29

series vacíasdescomposición de esquemas XML

anotados 107sintaxis abreviada

expresión de vía de acceso 174sistema de tipos XPath

visión general 147SQLJ

datos XMLcodificación 61

sustitución de subtipo 164

Ttipo de datos anyAtomicType 148tipo de datos anySimpleType 148tipo de datos anyType 148tipo de datos booleanos 151tipo de datos dateTime 153tipo de datos dayTimeDuration 156tipo de datos de fecha 152tipo de datos decimal 149tipo de datos double 150tipo de datos duration 155tipo de datos integer 151tipo de datos string 149tipo de datos time 153tipo de datos untyped 149tipo de datos untypedAtomic 149tipo de datos yearMonthDuration 157tipos

genéricos 148numérico, rango 151visión general 147xs:anyAtomicType 148xs:anySimpleType 148xs:anyType 148xs:boolean 151

tipos (continuación)xs:date 152xs:dateTime 153xs:dayTimeDuration 156xs:decimal 149xs:double 150xs:duration 155xs:integer 151xs:string 149xs:time 153xs:untyped 149xs:untypedAtomic 149xs:yearMonthDuration 157

tipos de datospromoción 163sustitución 164XML

compatibilidad paradescomposición 124

xs:anyAtomicType 148xs:anySimpleType 148xs:anyType 148xs:boolean 151xs:date 152xs:dateTime 153xs:dayTimeDuration 156xs:decimal 149xs:double 150xs:duration 155xs:integer 151xs:string 149xs:time 153xs:untyped 149xs:untypedAtomic 149xs:yearMonthDuration 157

tipos de datos numéricosrango 151

transformaciones XSLTconsideraciones importantes 28ejemplo 22, 24, 25visión general 20

trocear documentos XMLesquemas XML anotados 71

Vvalor NULL

SQLdescomposición 107

valoresXML 141

valores atómicos 134valores XML 141

XXML

actualizar columnas 39almacenamiento

correlaciones de nombre decodificación con CCSID 70

diferencias de documentos 31análisis 15añadir columnas XML 14añadir documentos XML a una base

de datos 14

XML (continuación)columnas 14

codificaciónvisión general 60

comparación de modelos 5comparación del modelo relacional 5construcción 17

manejo de caracteresespeciales 28

desarrollo de aplicaciones 41visión general 41

descomposición 70ejemplos de construcción de valores

XML 17filas de tabla 19una sola tabla 18varias tablas 19

ejemplos de publicaciónfilas de tabla 19una sola tabla 18varias tablas 19

ejemplos de XMLTABLE 32, 33, 34,36, 39

funciones de publicaciónmanejo de caracteres

especiales 28resumen 17

funciones de SQL/XMLpublicar 17

guía de aprendizaje 7actualizar documentos XML 8creación de una tabla 7insertar documentos XML 7transformar con XSLT 11validar documentos XML 9visión general 7

guía de aprendizaje de XML 7actualizar documentos XML 8creación de una tabla 7insertar documentos XML 7transformar con XSLT 11validar documentos XML 9

inserción 14visión general 14

métodos de entrada 4métodos de salida 4publicar 17

manejo de caracteresespeciales 28

rendimiento 60visión general 60

repositorio de esquemas XML(XSR) 40

serialización 29soporte de lenguajes de

programación 41suprimir 40suprimir datos 40tipos de datos de archivado 32transformación

XSLTRANSFORM 20, 22, 24, 28visión general 3

XMLAGG, función agregadapublicar XML 17

XMLATTRIBUTES, función escalarpublicar XML 17

238 IBM i: Programación SQL XML

Page 247: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

XMLCOMMENT, función escalarpublicar XML 17

XMLDOCUMENT, función escalarpublicar XML 17

XMLELEMENT, función escalarpublicar XML 17

XMLNAMESPACES, declaraciónpublicar XML 17

XMLPI, función escalarpublicar XML 17

XMLROW, función escalarpublicar XML 17

XMLTABLEejemplos 32, 33, 34, 36, 39

XMLTEXT, función escalarpublicar XML 17

XPathespacios de nombres XML 146expresiones primarias 164referencia de funciones 183referencia de variable 166tipos de datos numéricos 149tipos de fecha y hora 152visión general 142

xs:anyAtomicType 148xs:anySimpleType 148xs:anyType 148xs:boolean 151xs:date 152xs:dateTime 153xs:dayTimeDuration 156xs:decimal 149xs:double 150xs:duration 155xs:integer 151xs:string 149xs:time 153xs:untyped 149xs:untypedAtomic 149xs:yearMonthDuration 157XSLTRANSFORM, función escalar

publicar XML 17

Índice 239

Page 248: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

240 IBM i: Programación SQL XML

Page 249: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola
Page 250: Base de datos Programación SQL XML - ibm.com · Funciones de publicación de SQL/XML para construir valores XML.....17 Ejemplo: Construir un documento XML con valores de una sola

����

Número de Programa: 5770-SS1

Impreso en España