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 バージョン 1.0 に準拠する整形式 XML 文書でなければならないことを指定します (SQLSTATE 2200M)。
XML 式
データ・タイプ XML の値を戻す式。 XML-expression が、XML ホスト変数、または暗黙的あるいは明示的な型付きパラメーター・マーカーである場合、関数は、無視できる空白文字を除去する妥当性検査のための構文解析を実行し、CURRENT IMPLICIT XMLPARSE OPTION 設定は考慮されません。
XML-validate-according-to-clause
入力 XML 値の妥当性検査時に使用する情報を指定します。
ACCORDING TO XMLSCHEMA
妥当性検査用の XML スキーマ情報を明示的に指定することを示します。 この節が組み込まれない場合、XML スキーマ情報は XML-expression 値の内容で提供される必要があります。
ID XML スキーマ名 (XML-schema-name)
妥当性検査に使用される XML スキーマの SQL ID を指定します。 この名前 (暗黙的または明示的 SQL スキーマ修飾子を含む) は、現行のサーバーで XML スキーマ・リポジトリー内の既存の XML スキーマを固有に識別しなければなりません。 暗黙的または明示的に指定した SQL スキーマにこの名前の XML スキーマが存在しない場合は、エラー (SQLSTATE 42704) が戻されます。
ユーアールアイ XML-uri1
妥当性検査に使用される XML スキーマのターゲット名前空間 URI を指定します。 XML-uri1 の値は、URI を空でない文字ストリング定数として指定します。 URI は、登録済み XML スキーマのターゲット名前空間でなければならず (SQLSTATE 4274A)、LOCATION 節を指定しない場合は、登録済み XML スキーマを固有に識別する必要があります (SQLSTATE 4274B)。
NO NAMESPACE
妥当性検査用の XML スキーマはターゲット名前空間を持たないことを指定します。 ターゲット名前空間 URI は、明示的なターゲット名前空間 URI として指定できない空の文字ストリングと同等です。
ロケーション XML-uri2
妥当性検査に使用される XML スキーマの XML スキーマ・ロケーション URI を指定します。 XML-uri2 の値は、URI を空でない文字ストリング定数として指定します。 XML スキーマ・ロケーション URI は、ターゲット名前空間 URI と結合されて登録済み XML スキーマを識別する必要があり (SQLSTATE 4274A)、登録済みのそのような XML スキーマは 1 つだけでなければなりません (SQLSTATE 4274B)。
XML-valid-element-clause
XML-expression 内の XML 値が、指定されたエレメント名を、XML 文書のルート・エレメントとして持つ必要があることを指定します。
NAMESPACE XML-uri3 または NO NAMESPACE
妥当性検査されるエレメントのターゲット名前空間を指定します。 どちらの節も指定されない場合、指定されたエレメントは、妥当性検査に使用される登録済み XML スキーマのターゲット名前空間と同じ名前空間内にあると想定されます。
名前空間 XML-uri3
妥当性検査されるエレメントの名前空間 URI を指定します。 XML-uri3 の値は、URI を空でない文字ストリング定数として指定します。 これは、妥当性検査に使用される登録済み XML スキーマが複数の名前空間を持つ場合に使用することができます。
NO NAMESPACE
妥当性検査用のエレメントはターゲット名前空間を持たないことを指定します。 ターゲット名前空間 URI は、明示的なターゲット名前空間 URI として指定できない空の文字ストリングと同等です。
ELEMENT xml-element-name
妥当性検査に使用される XML スキーマ内のグローバル・エレメントの名前を指定します。 暗黙のまたは明示的名前空間を持つ、指定されるエレメントは、XML-expression の値のルート・エレメントと一致しなければなりません (SQLSTATE 22535 または 22536)。

結果のデータ・タイプは XML です。 XML-expression の値が NULL になる可能性がある場合、結果も NULL になる可能性があります。XML-expression の値が NULL の場合、結果も NULL 値です。

XML 妥当性検査プロセスは、シリアライズされた XML 値に対して実行されます。 XMLVALIDATE は XML タイプの引数で呼び出されるので、この値は、妥当性検査プロセスに先だって自動的にシリアライズされます。ただし以下の 2 つの例外があります。
  • XMLVALIDATE への引数が XML ホスト変数であるか、または暗黙的あるいは明示的な型付きパラメーター・マーカーである場合、妥当性検査のための構文解析操作が入力値に対して実行されます (暗黙の妥当性検査以外の構文解析は実行されず、CURRENT IMPLICIT XMLPARSE OPTION 設定は考慮されません)。
  • XMLVALIDATE への引数が、オプション PRESERVE WHITESPACE を使用した XMLPARSE 呼び出しである場合、文書の XML 構文解析および XML 妥当性検査は組み合わせて、単一の妥当性検査のための構文解析操作にすることができます。
XML 値が以前に妥当性検査されている場合、以前の妥当性検査のアノテーションが付けられたタイプ情報は、シリアライゼーション・プロセスにより除去されます。 ただし、以前の妥当性検査のデフォルト値およびエンティティー拡張は変更されません。 妥当性検査が成功した場合、すべての無視できる空白文字は結果から除去されます。

ルート・エレメントに名前空間がない文書を妥当性検査するには、xsi:noNamespaceSchemaLocation 属性がルート・エレメント上に存在していなければなりません。

  • XML スキーマの決定: XML スキーマは、XMLVALIDATE 呼び出しの一部として ACCORDING TO XMLSCHEMA 節を使って明示的に指定するか、または入力 XML 値内の XML スキーマ・ロケーション情報から暗黙的に決定することができます。 明示的または暗黙的な XML スキーマ情報は、XML スキーマ・リポジトリーに登録されている XML スキーマを識別する必要があり (SQLSTATE 42704、4274A、または 22532)、登録済みのそのような XML スキーマは 1 つだけでなければなりません (SQLSTATE 4274B または 22533)。

    ACCORDING TO XMLSCHEMA 節を使って妥当性検査用の XML スキーマが明示的に指定される場合、入力 XML 値で指定されるスキーマ・ロケーション情報は無視されます。

    ACCORDING TO XMLSCHEMA 節を使って XML スキーマ情報が指定されない場合、入力 XML 値に XML スキーマ・ロケーション情報が含まれていなければなりません (SQLSTATE 2200M)。 入力 XML 値内のスキーマ・ロケーション情報、名前空間名、およびスキーマ・ロケーションは、妥当性検査に使用される XML スキーマ・リポジトリー内の XML スキーマ文書を指定します。

  • XML スキーマ許可: 妥当性検査に使用される XML スキーマは、使用前に XML スキーマ・リポジトリーに登録されなければなりません。 ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
    • 妥当性検査時に使用される XML スキーマに対する USAGE 特権
    • DBADM 権限
  • XML スキーマでの 5000 より大きい maxOccurs 属性値の使用: Db2® バージョン 9.7 フィックスパック 1 以降では、 XSR に登録されている XML スキーマが maxOccurs 属性を使用し、この属性値が 5000 より大きい場合、 maxOccurs 属性値が「unounded」になります。 5000 を超える maxOccurs 属性値を持つ文書エレメントは「無制限」を指定する場合と同じように処理されるため、XMLVALIDATE 関数を使用すると、文書の妥当性検査に使用した XML スキーマに基づく最大値をエレメントの出現回数が超える場合でも、XML 文書は妥当性検査をパスする可能性があります。

    5000 を超える maxOccurs 属性値を持つエレメントを定義する XML スキーマを使用しているときに、5000 を超える maxOccurs 属性値を持つ XML 文書をリジェクトする場合は、その条件を検査するトリガーまたはプロシージャーを定義することができます。 トリガーまたはプロシージャーで、XPath 式を使用してエレメントの出現回数を数え、エレメントの数が maxOccurs 属性値を超える場合にエラーを返すようにします。

    例えば、以下のトリガーは、文書の電話 (phone) エレメントの出現回数が 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>
    さらに、ターゲット名前空間「http://my.world.com」と関連し、schemaLocation ヒント「http://my.world.com/world.xsd」による XML スキーマが、XML スキーマ・リポジトリー内にあると想定します。

    これらの前提事項に基づき、その XML スキーマに応じて入力 XML 値は妥当性検査されます。

  • 例 2: SQL 名 PODOCS.WORLDPO. によって識別される XML スキーマを使用して妥当性検査を行います。
       INSERT INTO T1(XMLCOL)
         VALUES (
           XMLVALIDATE(
             ? ACCORDING TO XMLSCHEMA ID PODOCS.WORLDPO
           )
         )

    SQL 名 FOO.WORLDPO に関連した XML スキーマが XML リポジトリー内にあると想定して、その 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 に関連した XML スキーマが XML リポジトリー内にあると想定して、XML スキーマは、名前空間が「http://my.world.com/Mary」であるエレメント「po」に対して妥当性検査されます。

  • 例 4: XML スキーマは、ターゲット名前空間およびスキーマ・ロケーションにより識別されます。
       INSERT INTO T1(XMLCOL)
         VALUES (
           XMLVALIDATE(
             ? ACCORDING TO XMLSCHEMA URI 'http://my.world.com'
             LOCATION 'http://my.world.com/world.xsd'
           )
         )

    ターゲット名前空間「http://my.world.com」と関連し、schemaLocation ヒント「http://my.world.com/world.xsd」による XML スキーマが XML スキーマ・リポジトリー内にあると想定して、そのスキーマに応じて入力 XML 値は妥当性検査されます。