XMLVALIDATE 标量函数
XMLVALIDATE 函数返回使用从 XML 模式验证获取的信息 (包括缺省值) 扩充的输入 XML 值的副本。
该模式是 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 的值为空,那么结果为空值。
- 如果 XMLVALIDATE 的自变量是 XML 主变量或隐式或显式输入的参数标记,那么将对输入值执行验证解析操作 (不执行隐式非验证解析,并且不考虑 CURRENT IMPLICIT XMLPARSE OPTION 设置)。
- 如果 XMLVALIDATE 的自变量是使用选项 PRESERVE WHITESPACE 的 XMLPARSE 调用,那么可以将文档的 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 值绑定。
此外,假定在 XML 模式存储库中找到与目标名称空间 "http://my.world.com" 相关联的 XML 模式,并通过 schemaLocation 提示 "http://my.world.com/world.xsd"。<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 模式验证输入 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 值。
