XMLVALIDATE 标量函数

XMLVALIDATE 函数返回使用从 XML 模式验证获取的信息 (包括缺省值) 扩充的输入 XML 值的副本。

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

该模式是 SYSIBM。 不能将函数名指定为限定名。

DOCUMENT
指定由 XML-expression 生成的 XML 值必须是符合 XML V 1.0 (SQLSTATE 2200M) 的格式正确的 XML 文档。
XML-expression
返回数据类型为 XML 的值的表达式。 如果 XML-expression 是 XML 主变量或隐式或显式输入的参数标记,那么该函数将执行验证解析,该解析会除去可忽略的空格,并且不考虑 CURRENT IMPLICIT XMLPARSE OPTION 设置。
XML-validate-based-to-子句
指定验证输入 XML 值时要使用的信息。
根据 XMLSCHEMA
指示显式指定用于验证的 XML 模式信息。 如果未包含此子句,那么必须在 XML-expression 值的内容中提供 XML 模式信息。
标识 XML-schema-name
指定要用于验证的 XML 模式的 SQL 标识。 该名称 (包括隐式或显式 SQL 模式限定符) 必须唯一地标识当前服务器的 XML 模式存储库中的现有 XML 模式。 如果隐式或显式指定的 SQL 模式中不存在具有此名称的 XML 模式,那么将返回错误 (SQLSTATE 42704)。
通用资源识别号 XML-uri1
指定要用于验证的 XML 模式的目标名称空间 URI。 XML-uri1 的值将 URI 指定为不为空的字符串常量。 URI 必须是已注册的 XML 模式 (SQLSTATE 4274A) 的目标名称空间,如果未指定 LOCATION 子句,那么它必须唯一地标识已注册的 XML 模式 (SQLSTATE 4274B)。
无名称空间
指定用于验证的 XML 模式没有目标名称空间。 目标名称空间 URI 等同于不能指定为显式目标名称空间 URI 的空字符串。
位置 XML-uri2
指定要用于验证的 XML 模式的 XML 模式位置 URI。 XML-uri2 的值将 URI 指定为不为空的字符串常量。 XML 模式位置 URI 与目标名称空间 URI 组合在一起,必须标识已注册的 XML 模式 (SQLSTATE 4274A) ,并且必须只有一个此类 XML 模式已注册 (SQLSTATE 4274B)。
XML-valid-element-子句
指定 XML-expression 中的 XML 值必须具有指定的元素名称作为 XML 文档的根元素。
NAMESPACE XML-uri3 NO NAMESPACE
指定要验证的元素的目标名称空间。 如果未指定任何子句,那么假定指定的元素与要用于验证的已注册 XML 模式的目标名称空间位于同一名称空间中。
名称空间 XML-uri3
指定要验证的元素的名称空间 URI。 XML-uri3 的值将 URI 指定为不为空的字符串常量。 当要用于验证的已注册 XML 模式具有多个名称空间时,可以使用此参数。
无名称空间
指定用于验证的元素没有目标名称空间。 目标名称空间 URI 等同于不能指定为显式目标名称空间 URI 的空字符串。
ELEMENT xml-元素-名称
指定 XML 模式中要用于验证的全局元素的名称。 具有隐式或显式名称空间的指定元素必须与 XML-expression 的值的根元素匹配 (SQLSTATE 22535 或 22536)。

结果的数据类型为 XML。 如果 XML-expression 的值可以为空,那么结果可以为空; 如果 XML-expression 的值为空,那么结果为空值。

对序列化的 XML 值执行 XML 验证过程。 由于使用类型为 XML 的自变量调用 XMLVALIDATE ,因此此值在验证处理之前会自动序列化,并出现以下两种异常。
  • 如果 XMLVALIDATE 的自变量是 XML 主变量或隐式或显式输入的参数标记,那么将对输入值执行验证解析操作 (不执行隐式非验证解析,并且不考虑 CURRENT IMPLICIT XMLPARSE OPTION 设置)。
  • 如果 XMLVALIDATE 的自变量是使用选项 PRESERVE WHITESPACE 的 XMLPARSE 调用,那么可以将文档的 XML 解析和 XML 验证组合到单个验证解析操作中。
如果先前已验证 XML 值,那么序列化过程将除去先前验证中的带注释类型信息。 但是,先前验证中的任何缺省值和实体扩展保持不变。 如果验证成功,那么将从结果中除去所有可忽略的空格字符。

要验证根元素没有名称空间的文档,根元素上必须有xsi:noNamespaceSchemaLocation属性。

注意

  • 确定 XML 模式: 可以使用 AS TO XMLSCHEMA 子句作为 XMLVALIDATE 调用的一部分显式指定 XML 模式,也可以根据输入 XML 值中的 XML 模式位置信息隐式确定 XML 模式。 显式或隐式 XML 模式信息必须标识在 XML 模式存储库中注册的 XML 模式 (SQLSTATE 42704 , 4274A或 22532) ,并且必须只有一个此类注册的 XML 模式 (SQLSTATE 4274B 或 22533)。

    如果使用 BASED TO XMLSCHEMA 子句显式指定了用于验证的 XML 模式,那么将忽略输入 XML 值中指定的模式位置信息。

    如果未使用 BASED TO XMLSCHEMA 子句指定 XML 模式信息,那么输入 XML 值必须包含 XML 模式位置信息 (SQLSTATE 2200M)。 输入 XML 值,名称空间名称和模式位置中的模式位置信息指定用于验证的 XML 模式存储库中的 XML 模式文档。

  • XML 模式授权: 用于验证的 XML 模式必须先在 XML 模式存储库中注册,然后才能使用。 语句授权标识所拥有的特权必须至少包括下列其中一项权限:
    • 对要在验证期间使用的 XML 模式的 USAGE 特权
    • DBADM 权限
  • 在 XML 模式中使用大于 5000 的 maxOccurs 属性值: Db2® 版本 9.7 修订包 1 及更高版本中,如果 在 XSR 中注册的 XML 模式使用值大于 5000 的 maxOccurs 属性,那么会将 maxOccurs 属性值视为您指定的 "无界"。 因为会将其 maxOccurs 属性值大于 5000 的文档元素视作您指定了“无限制”一样来处理,所以当您使用 XMLVALIDATE 函数时,XML 文档可能会通过验证,即使按照您用来验证该文档的 XML 模式,某个元素的出现次数超过了最大值也是如此。

    如果您使用的 XML 模式定义了其 maxOccurs 属性值大于 5000 的元素并且您要拒绝其 maxOccurs 属性值大于 5000 的 XML 文档,那么可以定义触发器或过程以检查该条件。 在触发器或过程中,使用 XPath 表达式对元素的出现次数进行计数,并在元素数量超过 maxOccurs 属性值时返回错误。

    例如,以下触发器确保文档具有的电话元素从不超过 6500 个:
    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 

示例

  • 示例 1: 使用 XML 实例文档中的 XML 模式提示所标识的 XML 模式进行验证。
       INSERT INTO T1(XMLCOL)
         VALUES (XMLVALIDATE(?))
    假定输入参数标记与包含 XML 模式信息的 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>
    此外,假定在 XML 模式存储库中找到与目标名称空间 "http://my.world.com" 相关联的 XML 模式,并通过 schemaLocation 提示 "http://my.world.com/world.xsd"。

    基于这些假设,将根据该 XML 模式验证输入 XML 值。

  • 示例 2: 使用 SQL 名称 PODOCS.WORLDPO。
       INSERT INTO T1(XMLCOL)
         VALUES (
           XMLVALIDATE(
             ? ACCORDING TO XMLSCHEMA ID PODOCS.WORLDPO
           )
         )

    假定与 SQL 名称 FOO.WORLDPO ,将根据该 XML 模式验证输入 XML 值。

  • 示例 3: 验证 XML 值的指定元素。
      
       INSERT INTO T1(XMLCOL)
         VALUES (
           XMLVALIDATE(
             ? ACCORDING TO XMLSCHEMA ID FOO.WORLDPO
             NAMESPACE 'http://my.world.com/Mary'
             ELEMENT "po"
           )
         )

    假定与 SQL 名称 FOO.WORLDPO ,将针对其名称空间为 "http://my.world.com/Mary" 的元素 "po" 验证 XML 模式。

  • 示例 4: XML 模式由目标名称空间和模式位置标识。
       INSERT INTO T1(XMLCOL)
         VALUES (
           XMLVALIDATE(
             ? ACCORDING TO XMLSCHEMA URI 'http://my.world.com'
             LOCATION 'http://my.world.com/world.xsd'
           )
         )

    假定在 XML 模式存储库中找到与目标名称空间 "http://my.world.com" 和 schemaLocation 提示 "http://my.world.com/world.xsd" 相关联的 XML 模式,那么将根据该模式验证输入 XML 值。