Función escalar XMLVALIDATE
La función XMLVALIDATE devuelve una copia del valor de entrada XML aumentado con la información obtenida a partir de la validación de esquema XML, incluidos los valores por omisión.
El esquema es SYSIBM. El nombre de la función no puede especificarse como un nombre calificado.
- DOCUMENT
- Especifica que el valor XML resultante de la expresión-XML debe ser un documento XML con el formato correcto conforme a XML Versión 1.0 (SQLSTATE 2200M).
- expresión-XML
- Una expresión que devuelve un valor del tipo de datos XML. Si la expresión-XML es una variable del lenguaje principal XML o un marcador de parámetro escrito implícita o explícitamente, la función ejecuta un análisis de validación que elimina espacios en blanco que se pueden ignorar y el valor CURRENT IMPLICIT XMLPARSE OPTION no se tiene en cuenta.
- validar-XML-según-cláusula
- Especifica la información que se usará al validar el valor de entrada XML.
- ACCORDING TO XMLSCHEMA
- Indica que la información del esquema XML para la validación se especifica de forma explícita. Si no se incluye esta cláusula, se debe proporcionar la información del esquema XML en el contenido del valor expresión-XML.
- ID nombre-esquema-XML
- Especifica un identificador de SQL para el esquema XML que se utilizará para la validación. El nombre (incluido el calificador de esquema de SQL implícito o explícito) debe designar de forma exclusiva un esquema XML existente en el depósito de esquemas XML en el servidor actual. Si no existe un esquema XML con este nombre en el esquema de SQL especificado explícita o implícitamente, se devuelve un error (SQLSTATE 42704).
- URI uri1-XML
- Especifica el URI del espacio de nombres de destino del esquema XML que se utilizará para la validación. El valor de XML-uri1 especifica un URI como constante de serie de caracteres que no está vacía. El URI debe ser el espacio de nombres de destino de un esquema XML registrado (SQLSTATE 4274A) y, si no se ha especificado una cláusula LOCATION, debe identificar exclusivamente el esquema XML registrado (SQLSTATE 4274B).
- NO NAMESPACE
- Especifica que el esquema XML para la validación no tenga espacio de nombres de destino. El URI del espacio de nombres de destino es equivalente a una serie de caracteres vacía que no se puede especificar como URI de espacio de nombres de destino explícito.
- LOCATION uri2-XML
- Especifica el URI de ubicación del esquema XML que se utilizará para la validación. El valor de uri2-XML especifica un URI como constante de serie de caracteres que no está vacía. El URI de ubicación del esquema XML, combinado con el URI del espacio de nombres de destino, debe identificar un esquema XML registrado (SQLSTATE 4274A), y sólo debe existir ese esquema XML registrado (SQLSTATE 4274B).
- cláusula-elemento-válido-XML
- Especifica que el valor XML en la expresión-XML debe tener el nombre del elemento especificado como elemento raíz del documento XML.
- NAMESPACE uri3-XML o NO NAMESPACE
- Especifica el espacio de nombres de destino para el elemento que se deba validar. Si no se especifica cláusula alguna, se presupone que el elemento especificado se encuentra en el mismo espacio de nombres que el espacio de nombres de destino del esquema XML registrado que se utilizará para la validación.
- NAMESPACE uri3-XML
- Especifica el URI del espacio de nombres para el elemento que se debe validar. El valor de XML-uri3 especifica un URI como constante de serie de caracteres que no está vacía. Éste se puede utilizar cuando el esquema XML registrado que se utilizará para la validación tiene más de un espacio de nombres.
- NO NAMESPACE
- Especifica que el elemento para la validación no tiene espacio de nombres de destino. El URI del espacio de nombres de destino es equivalente a una serie de caracteres vacía que no se puede especificar como URI de espacio de nombres de destino explícito.
- ELEMENT nombre-elemento-xml
- Especifica el nombre de un elemento global en el esquema XML que se utilizará para la validación. El elemento especificado, con espacio de nombres implícito o explícito, debe coincidir con el elemento raíz del valor de expresión-XML (SQLSTATE 22535 o 22536).
El tipo de datos del resultado es XML. Si el valor de la expresión-XML puede ser nulo, el resultado puede ser nulo; si el valor de la expresión-XML es nulo, el resultado es el valor nulo.
- Si el argumento para XMLVALIDATE es una variable del lenguaje principal XML o un marcador de parámetro escrito implícita o explícitamente, se ejecuta una operación de análisis de validación en el valor de entrada (no se lleva a cabo ningún análisis implícito que no sea de validación y no se tiene en cuenta el valor CURRENT IMPLICIT XMLPARSE OPTION).
- Si el argumento para XMLVALIDATE es una invocación XMLPARSE que utiliza la opción PRESERVE WHITESPACE, el análisis XML y la validación XML del documento se pueden combinar en una única operación de análisis de validación.
Para validar un documento cuyo elemento raíz no tiene un espacio de nombres, debe existir un atributo xsi:noNamespaceSchemaLocation en el elemento raíz.
Notas
- Determinación del esquema XML: el esquema XML se puede especificar explícitamente con la cláusula DE ACUERDO CON XMLSCHEMA como parte de la invocación XMLVALIDATE, o se puede determinar implícitamente a partir de la información de ubicación del esquema XML en el valor XML de entrada. La información del esquema XML explícita o implícita debe identificar un esquema XML registrado en el depósito de esquemas XML (SQLSTATE 42704, 4274A o 22532), y sólo debe existir ese esquema XML registrado (SQLSTATE 4274B o 22533).
Si un esquema XML para la validación se especifica explícitamente con la cláusula SEGUN TO XMLSCHEMA , la información de ubicación de esquema especificada en el valor XML de entrada se ignora.
Si la información de esquema XML no se especifica con la cláusula SEGUN TO XMLSCHEMA , el valor XML de entrada debe contener información de ubicación de esquema XML (SQLSTATE 2200M). La información de la ubicación del esquema en el valor de entrada XML, un nombre de espacio de nombres y una ubicación de esquema especifican el documento de esquema XML en el depósito de esquemas XML utilizado para la validación.
- Autorización de esquema XML: El esquema XML que se utiliza para la validación debe registrarse en el depósito de esquemas XML antes de utilizarlo. Los privilegios que posee el ID de autorización de la sentencia debe tener al menos una de las autorizaciones siguientes:
- Privilegio USAGE en el esquema XML que se debe utilizar durante la validación
- Autorización DBADM
- Utilización de un valor de atributo maxOccurs mayor que 5000 en esquemas XML: En Db2® Versión 9.7 Fixpack 1 y posterior, si un esquema XML registrado en el XSR utiliza el atributo maxOccurs donde el valor es mayor que 5000, el valor del atributo maxOccurs se trata como si hubiera especificado "unbounded". Puesto que los elementos de documento que tienen el atributo maxOccurs con un valor mayor que 5.000 se procesan como si se especificara que no está vinculado, es probable que un documento XML pase la validación al utilizar la función XMLVALIDATE incluso si el número de apariciones de un elemento excede el máximo en función del esquema XML utilizado para validar el documento.
Si utiliza un esquema XML que define un elemento que tiene el atributo maxOccurs con un valor mayor que 5.000 y desea rechazar los documentos XML que tengan un valor de atributo maxOccurs mayor que 5.000, se puede definir un activador o un procedimiento para comprobar dicha condición. En el activador o procedimiento, utilice una expresión XPath para contar el número de apariciones del elemento y devolver un error si el número de elementos excede el valor del atributo maxOccurs.
Por ejemplo, el activador siguiente garantiza que un documento nunca tenga más de 6.500 elementos de teléfono:CREATE TRIGGER CUST_INSERT AFTER INSERT ON CUSTOMER REFERENCING NEW AS NEWROW FOR EACH ROW MODE DB2SQL BEGIN ATOMIC SELECT CASE WHEN X <= 6500 THEN 'OK - Do Nothing' ELSE RAISE_ERROR('75000', 'TooManyPhones') END FROM ( SELECT XMLCAST(XMLQUERY('$INFO/customerinfo/count(phone)') AS INTEGER) AS X FROM CUSTOMER WHERE CUSTOMER.CID = NEWROW.CID ); END
ejemplos
- Ejemplo 1: Valide utilizando el esquema XML identificado por la sugerencia del esquema XML en el documento de instancia XML.
INSERT INTO T1(XMLCOL) VALUES (XMLVALIDATE(?))Se presupone que el marcador de parámetro de entrada está vinculado a un valor XML que contiene la información del esquema XML.
Asimismo, se presupone que el esquema XML que está asociado con el espacio de nombres de destino "http://my.world.com" y por la sugerencia schemaLocation "http://my.world.com/world.xsd" se encuentra en el depósito del esquema XML.<po:order xmlns:po="http://my.world.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://my.world.com http://my.world.com/world.xsd" > ... </po:order>Basándose en estas suposiciones, se validará el valor de entrada XML de acuerdo con ese esquema XML.
- Ejemplo 2: Valide utilizando el esquema XML identificador por el nombre de SQL PODOCS.WORLDPO.
INSERT INTO T1(XMLCOL) VALUES ( XMLVALIDATE( ? ACCORDING TO XMLSCHEMA ID PODOCS.WORLDPO ) )Suponiendo que el esquema XML que esté asociado con el nombre de SQL FOO.WORLDPO se encuentre en el depósito XML, se validará el valor de entrada XML de acuerdo con ese esquema XML.
- Ejemplo 3: Valide un elemento especificado del valor XML.
INSERT INTO T1(XMLCOL) VALUES ( XMLVALIDATE( ? ACCORDING TO XMLSCHEMA ID FOO.WORLDPO NAMESPACE 'http://my.world.com/Mary' ELEMENT "po" ) )Suponiendo que el esquema XML que esté asociado con el nombre de SQL FOO.WORLDPO se encuentre en el depósito XML, se validará el esquema XML en relación al elemento "po", cuyo espacio de nombres es 'http://my.world.com/Mary'.
- Ejemplo 4: El esquema XML se identifica por el espacio de nombres de destino y la ubicación del esquema.
INSERT INTO T1(XMLCOL) VALUES ( XMLVALIDATE( ? ACCORDING TO XMLSCHEMA URI 'http://my.world.com' LOCATION 'http://my.world.com/world.xsd' ) )Suponiendo que un esquema XML asociado con el espacio de nombres de destino "http://my.world.com" y por la sugerencia schemaLocation "http://my.world.com/world.xsd" se encuentre en el depósito del esquema XML, el valor de entrada XML se validará de acuerdo con ese esquema.
