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.

Read syntax diagramSkip visual syntax diagramXMLVALIDATE(DOCUMENT XML-expressionXML-validate-according-to-clause )
XML-validate-according-to-clause
Read syntax diagramSkip visual syntax diagramACCORDING TO XMLSCHEMA IDXML-schema-nameURIXML-uri1NO NAMESPACELOCATIONXML-uri2 XML-valid-element-clause
XML-valid-element-clause
Read syntax diagramSkip visual syntax diagramNAMESPACEXML-uri3NO NAMESPACEELEMENTXML-element-name

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.

El proceso de validación XML se lleva a cabo en un valor XML serializado. Puesto que XMLVALIDATE se invoca como un argumento de tipo XML, este valor se serializa automáticamente antes del proceso de validación, con las dos excepciones siguientes.
  • 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.
Si un valor XML se ha validado anteriormente, el proceso de serialización elimina la información del tipo anotado de la validación anterior. Sin embargo, los valores por omisión y las expansiones de entidades de la validación anterior permanecen sin cambios. Si la validación es satisfactoria, todos los caracteres de espacio en blanco que se puedan ignorar se eliminarán del resultado.

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.
       <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>
    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.

    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.