すべてのプロダクト
Search
ドキュメントセンター

PolarDB:XML 関数

最終更新日:May 31, 2024

このセクションで説明する関数と関数のような式は、xml型の値を操作します。

これらの関数のほとんどを使用するには、configure -- with-libxmlで構築されている必要があります。

XMLコンテンツの作成

SQLデータからXMLコンテンツを生成するために、関数と関数のような式のセットを使用できます。 したがって、これらは、クライアントアプリケーションで処理するためにクエリ結果をXML文書にフォーマットするのに特に適している。

xmlcomment

xmlcomment (テキスト) → xml

関数xmlcommentは、指定されたテキストをコンテンツとして含むXMLコメントを含むXML値を作成します。 テキストに「 -- 」を含めることも、「-」で終わることもできません。そうしないと、結果として得られるコンストラクトは有効なXMLコメントになりません。 引数がnullの場合、結果はnullになります。

例:

SELECT xmlcomment('hello');

      xmlcomment
    --------------
     <!-- こんにちは --> 

xmlconcat

xmlconcat ( xml [, ...] ) → xml

関数xmlconcatは、個々のXML値のリストを連結して、XMLコンテンツフラグメントを含む単一の値を作成します。 Null値は省略されます。非null引数がない場合、結果はNullのみになります。

例:

SELECT xmlconcat('<abc/>', '<bar>foo</bar>');

          xmlconcat
    ----------------------
     <abc/><bar>foo</bar> 

XML宣言は、存在する場合、以下のように組み合わされる。 すべての引数値が同じXMLバージョン宣言を持つ場合、そのバージョンが結果で使用されます。 すべての引数値がスタンドアロン宣言値「yes」を持つ場合、その値が結果で使用されます。 すべての引数値がスタンドアロン宣言値を持ち、少なくとも1つが「いいえ」の場合、それが結果で使用されます。 そうでない場合、結果にはスタンドアロン宣言がありません。 結果がスタンドアロン宣言を必要とし、バージョン宣言を必要としないと判断された場合、XMLはXML宣言にバージョン宣言を含める必要があるため、バージョン1.0のバージョン宣言が使用されます。 エンコード宣言は無視され、すべての場合に削除されます。

例:

SELECT xmlconcat('<?xml version="1.1" ?>< foo/>' 、'<?xml version="1.1" standalone="no" ?>< bar/>');

                 xmlconcat
    -----------------------------------
     <?xml version="1.1" ?>< foo/><bar/> 

xmlelement

xmlelement ( NAME name [, XMLATTRIBUTES ( attvalue [ AS attname ] [, ...] )) ] [, content [, ...]] ) → xml

xmlelement式は、指定された名前、属性、およびコンテンツを持つXML要素を生成します。 構文に示されているnameおよびattname項目は、値ではなく単純な識別子です。 attvalueおよびcontent項目は式であり、anyPostgreSQLdata型を生成できます。 XMLATTRIBUTES内の引数は、XML要素の属性を生成し、コンテンツ値は、そのコンテンツを形成するために連結される。

例:

SELECT xmlelement(name foo);

     xmlelement
    ------------
     <foo/>

    SELECT xmlelement(name foo, xmlattributes('xyz' as bar));

        xmlelement
    ------------------
     <foo bar="xyz"/>

    SELECT xmlelement(name foo, xmlattributes(current_date as bar), 'cont', 'ent');

                 xmlelement
    -------------------------------------
     <foo bar="2007-01-26"> コンテンツ </foo> 

有効なXML名ではない要素名と属性名は、問題の文字をシーケンス _x_ で置き換えることによってエスケープされます。ここで、HHHHは文字の16進表記のUnicodeコードポイントです。 設定例:

SELECT xmlelement(name "foo$bar" 、xmlattributes('xyz' as "a&b"));

                xmlelement
    ----------------------------------
     <foo_x0024_bar a_x0026_b="xyz"/> 

属性値が列参照である場合、明示的な属性名を指定する必要はなく、その場合、列の名前がデフォルトで属性名として使用されます。 それ以外の場合は、属性に明示的な名前を付ける必要があります。 したがって、この例は有効です。

CREATE TABLEテスト (a xml, b xml);
    SELECT xmlelement(name test, xmlattributes(a, b)) テストから; 

しかし、これらはありません:

SELECT xmlelement(name test, xmlattributes('constant'), a, b) テストから
    SELECT xmlelement(name test, xmlattributes(func(a, b))) テストから; 

要素コンテンツを指定すると、そのデータ型に従ってフォーマットされます。 コンテンツ自体がxml型である場合、複雑なXMLドキュメントを構築できます。 設定例:

SELECT xmlelement(name foo、xmlattributes('xyz' as bar)) 、
                                xmlelement (名前abc) 、
                                xmlcomment('test') 、
                                xmlelement (名前xyz);

                      xmlelement
    ----------------------------------------------
     <foo bar="xyz"><abc/><!-- test --><xyz/></foo> 

他のタイプのコンテンツは、有効なXML文字データにフォーマットされます。 これは特に、文字 <、> 、および&がエンティティに変換されることを意味します。 バイナリデータ (データ型bytea) は、設定パラメーターxmlbinaryの設定に応じて、base64またはhexエンコーディングで表されます。

xmlforest

xmlforest ( content [ AS name ] [, ...] ) → xml

xmlforest式は、指定された名前とコンテンツを使用して要素のXMLフォレスト (シーケンス) を生成します。 xmlelementの場合、各nameは単純な識別子である必要がありますが、content式は任意のデータ型を持つことができます。

例:

SELECT xmlforest('abc' AS foo、123 ASバー);

              xmlforest
    ------------------------------
     <foo>abc</foo><bar>123</bar>


    SELECT xmlforest(table_name, column_name)
    FROM information_schema.columns
    WHERE table_schema = 'pg_catalog';

                                    xmlforest
    ------------------------------------​-----------------------------------
     <table_name>pg_authid</table_name> <column_name>rolname</column_name>
     <table_name>pg_authid</table_name> <column_name>rolsuper</column_name>
     ...

2番目の例に見られるように、コンテンツ値が列参照である場合、要素名は省略できます。この場合、列名はデフォルトで使用されます。 それ以外の場合は、名前を指定する必要があります。

有効なXML名でない要素名は、上記のxmlelementのようにエスケープされます。 同様に、コンテンツデータは、既にXML型でない限り、有効なxmlコンテンツにエスケープされます。

説明

XMLフォレストは複数の要素で構成されている場合は有効なXMLドキュメントではないため、xmlforest式をxmlelementでラップすると便利な場合があります。

xmlpi

xmlpi ( NAME name [, content ] ) → xml

xmlpi式は、XML処理命令を作成する。 xmlelementの場合、nameは単純な識別子である必要がありますが、content式は任意のデータ型を持つことができます。 contentが存在する場合、文字シーケンス ?> を含めることはできません。

例:

SELECT xmlpi (名前php、'echo "hello world";');

                xmlpi
    -----------------------------
     <?phpエコー "hello world" ;?> 

xmlroot

xmlroot ( xml, VERSION {text | NO VALUE} [, STANDALONE {YES | NO | NO VALUE} ] ) → xml

xmlroot式は、XML値のルートノードのプロパティを変更します。 バージョンを指定すると、ルートノードのバージョン宣言の値が置き換えられます。スタンドアロン設定を指定すると、ルートノードのスタンドアロン宣言の値が置き換えられます。

SELECT xmlroot(xmlparse(document '<?xml version="1.1" ?>< content>abc</content>') 、
                   バージョン '1.0 '、スタンドアロンはい);

                    xmlroot
    ----------------------------------------
     <?xml version="1.0" standalone="yes"?>
     <content>abc</content> 

xmlagg

xmlagg ( xml ) → xml

関数xmlaggは、ここで説明する他の関数とは異なり、集合関数である。 これは、xmlconcatと同様に、入力値を集計関数呼び出しに連結します。ただし、連結は、単一の行の式全体ではなく、行全体で行われます。

例:

CREATE TABLEテスト (y int, x xml);
    INSERT INTO test VALUES (1, '<foo>abc</foo>');
    INSERT INTO test VALUES (2, '<bar/>');
    SELECT xmlagg(x) テストから;
            xmlagg
    ----------------------
     <foo>abc</foo><bar/> 

連結の順序を決定するために、order BY句を集約呼び出しに追加することができる。 設定例:

テストからのSELECT xmlagg(x ORDER BY y DESC);
            xmlagg
    ----------------------
     <bar/><foo>abc</foo> 

以前のバージョンでは次の非標準的なアプローチが推奨されていましたが、特定のケースでは引き続き役立つ場合があります。

SELECT xmlagg(x) FROM (SELECT * FROMテストORDER BY y DESC) ASタブ;
            xmlagg
    ----------------------
     <bar/><foo>abc</foo> 

XML述語

このセクションで説明する式は、xml値のプロパティをチェックします。

ISドキュメント

xml IS DOCUMENT → ブール値

IS DOCUMENTは、引数XML値が適切なXMLドキュメントである場合はtrue、そうでない (つまりコンテンツフラグメントである) 場合はfalse、引数がnullの場合はnullを返します。

ドキュメントではありません

xmlはドキュメントではない → ブール値

IS NOT DOCUMENTは、引数XML値が適切なXMLドキュメントである場合はfalseを返し、そうでない (つまりコンテンツフラグメントである) 場合はtrueを返し、引数がnullの場合はnullを返します。

XMLEXISTS

XMLEXISTS (テキストPASSING [BY {REF | VALUE}]] xml [BY {REF | VALUE}] ) → ブール値

関数xmlexistsは、渡されたXML値をコンテキスト項目として、XPath 1.0式 (最初の引数) を評価します。 この関数は、その評価の結果が空のノードセットを生成する場合はfalseを返し、他の値を生成する場合はtrueを返します。 引数がnullの場合、関数はnullを返します。 コンテキスト項目として渡されるnull以外の値は、コンテンツフラグメントやXML以外の値ではなく、XMLドキュメントである必要があります。

例:

SELECT xmlexists('// town[text() ='Toronto '']' PASSING BY VALUE '<towns><town> トロント </town><town> オタワ </town></towns>');

     xmlexists
    ------------
     t
    (1行) 

SQL標準では、xmlexists関数はXMLクエリ言語の式を評価します。butPostgreSQLallowsはXPath 1.0式のみです。

xml_is_well_formed

xml_is_well_formed (テキスト) → ブール値
    xml_is_well_formed_document (テキスト) → ブール値
    xml_is_well_formed_content (テキスト) → ブール値 

これらの関数は、テキスト文字列が整形式のXMLを表しているかどうかをチェックし、ブール結果を返します。xml_is_well_formed_documentは整形式ドキュメントをチェックし、xml_is_well_formed_contentは整形式コンテンツをチェックします。xml_is_well_formedは、xml_is_wellコンフィギュレーションパラメーターがDOCUMENTに設定されている場合は前者を行い、CONTENTに設定されている場合は後者を行います。 つまり、xml_is_well_formedは、xml型への単純なキャストが成功するかどうかを確認するのに役立ちますが、他の2つの関数は、XMLPARSEの対応するバリアントが成功するかどうかを確認するのに役立ちます。

例:

ドキュメントにxmloptionを設定します。
    SELECT xml_is_well_formed('<>');
     xml_is_well_formed
    --------------------
     f
    (1行)

    SELECT xml_is_well_formed('<abc/>');
     xml_is_well_formed
    --------------------
     t
    (1行)

    コンテンツにxmloptionを設定します。
    SELECT xml_is_well_formed('abc');
     xml_is_well_formed
    --------------------
     t
    (1行)

    SELECT xml_is_well_formed_document('<pg:foo xmlns:pg=" http://postgresql.org/stuff ">bar</pg:foo>');
     xml_is_well_formed_document
    -----------------------------
     t
    (1行)

    SELECT xml_is_well_formed_document('<pg:foo xmlns:pg=" http://postgresql.org/stuff ">bar</my:foo>');
     xml_is_well_formed_document
    -----------------------------
     f
    (1行) 

最後の例は、名前空間が正しく一致しているかどうかのチェックを示しています。

XMLの処理

データ型xmlの値を処理するために、PostgreSQLは、xpath 1.0式を評価する関数xpathXPath_exists、およびXMLTABLEテーブル関数を提供します。

xpath

xpath ( xpath text, xml xml [, nsarray text[] ] ) → xml[]

関数xpathは、XML値xmlに対してXPath 1.0式xpath (テキストとして指定) を評価します。 XPath式によって生成されたノードセットに対応するXML値の配列を返します。 XPath式がノードセットではなくスカラー値を返す場合、単一要素の配列が返されます。

2番目の引数は、整形されたXMLドキュメントでなければなりません。 特に、単一のルートノード要素を持たなければならない。

関数のオプションの3番目の引数は、名前空間マッピングの配列です。 この配列は、2番目の軸の長さが2に等しい2次元テキスト配列である必要があります (つまり、それぞれが正確に2つの要素からなる配列の配列である必要があります) 。 各配列エントリの最初の要素は名前空間名 (エイリアス) 、2番目の要素は名前空間URIです。 この配列で提供されるエイリアスは、XMLドキュメント自体で使用されているエイリアスと同じである必要はありません (つまり、XMLドキュメントとxpath関数コンテキストの両方で、エイリアスはローカルです) 。

例:

SELECT xpath('/my:a/text()', '<my:a xmlns:my=" http://example.com ">test</my:a>',
                 ARRAY[ARRAY['my', 'http:// example.com ']]);

     xpath
    --------
     {test}
    (1行) 

デフォルトの (匿名) 名前空間を扱うには、次のようにします。

SELECT xpath('// mydefns:b/text()' 、'<a xmlns=" http://example.com "><b>test</b></a>' 、
                 ARRAY[ARRAY['mydefns', 'http:// example.com ']]]);

     xpath
    --------
     {test}
    (1行) 

xpath_exists

xpath_exists ( xpath text, xml xml [, nsarray text[] ] ) → ブール値

関数xpath_existsは、xpath関数の特殊な形式です。 この関数は、XPath 1.0式を満たす個々のXML値を返す代わりに、クエリが満たされたかどうか (具体的には、空のノードセット以外の値を生成したかどうか) を示すブール値を返します。 この関数は、名前空間マッピング引数のサポートも提供することを除いて、XMLEXISTS述語と同等です。

例:

SELECT xpath_exists('/my:a/text()', '<my:a xmlns:my=" http://example.com ">test</my:a>',
                         ARRAY[ARRAY['my', 'http:// example.com ']]);

     xpath_exists
    --------------
     t
    (1行) 

xmltable

XMLTABLE (
        [XMLNAMESPACES ( namespace_uri AS namespace_name [, ...] ), ]
        row_expression PASSING [BY {REF | 値}] document_expression [BY {REF | 値}]
        COLUMNS name { type [PATH column_expression] [DEFAULT default_expression] [NOT NULL | NULL]
                      | 秩序のために}
                [, ...]
    ) → setofレコード 

xmltable式は、XML値、行を抽出するためのXPathフィルター、および一連の列定義に基づいてテーブルを生成します。 構文的には関数に似ていますが、クエリのFROM句ではテーブルとしてしか表示できません。

オプションのXMLNAMESPACES句は、名前空間定義のコンマ区切りのリストを提供します。ここで、各namespace_uritext式で、各namespace_nameは単純な識別子です。 ドキュメントで使用されるXML名前空間とそのエイリアスを指定します。 デフォルトの名前空間仕様は現在サポートされていません。

必須のrow_expression引数は、XMLノードのセットを取得するために、XML値のdocument_expressionをコンテキスト項目として渡して評価されるXPath 1.0式 (textとして指定) です。 これらのノードは、xmltableが出力行に変換するものです。 document_expressionがnullの場合、またはrow_expressionが空のノードセットまたはノードセット以外の値を生成する場合、行は生成されません。

document_expressionは、row_expressionのコンテキストアイテムを提供します。 適切なXMLドキュメントである必要があります。フラグメント /フォレストは受け入れられません。 BY REFおよびBY VALUE句は受け入れられますが、無視されます。

SQL標準では、xmltable関数はXMLクエリ言語の式を評価します。butPostgreSQLallowsはXPath 1.0式のみです。

必須のCOLUMNS句は、出力テーブルで生成される列を指定します。 形式については、上記の構文の概要を参照してください。 データ型と同様に、各列に名前が必要です (for ORDINALITYが指定されていない場合、type integerは暗黙的です) 。 path、default、およびnullability句はオプションです。

FOR ORDINALITYとマークされた列には、row_expressionの結果ノードセットから取得されたノードの順序で、1から始まる行番号が入力されます。 最大で1つの列がFOR ORDINALITYとマークされ得る。

重要

XPath 1.0は、ノードセット内のノードの順序を指定しないため、結果の特定の順序に依存するコードは、実装に依存します。

列のcolume_expressionは、列の値を見つけるために、row_expression結果の現在のノードをコンテキスト項目として、行ごとに評価されるXPath 1.0式です。 colume_expressionが指定されていない場合、列名は暗黙パスとして使用されます。

列のXPath式がXML以外の値 (XPath 1.0ではstring、boolean、doubleに限定されます) を返し、列にxml以外のPostgreSQL型がある場合、値の文字列表現をPostgreSQL型に割り当てることで、列が設定されます。 (値がブール値の場合、その文字列表現は、出力列の型カテゴリが数値の場合は1または0となり、それ以外の場合はtrueまたはfalseとなります) 。

列のXPath式が空でないXMLノードのセットを返し、列のPostgreSQL型がxmlの場合、列がドキュメント形式またはコンテンツ形式の場合、列には正確に式の結果が割り当てられます。[8]

XML出力列に割り当てられた非xml結果は、結果の文字列値を持つ単一のテキストノードであるコンテンツを生成します。 他のタイプの列に割り当てられたXML結果は、複数のノードを持たないか、エラーが発生します。 ノードが1つだけある場合、列は、ノードの文字列値 (XPath 1.0文字列関数で定義されている) をPostgreSQL型に割り当てることによって、のように設定されます。

XML要素の文字列値は、その要素に含まれるすべてのテキストノードとその子孫の、ドキュメント順の連結です。 子孫テキストノードを持たない要素の文字列値が空の文字列 (NULLではない) です。 xsi:nil属性はすべて無視されます。 2つの非テキスト要素間の空白のみのtext() ノードは保持され、text() ノードの先頭の空白はフラット化されません。 XPath 1.0文字列関数は、他のXMLノードタイプの文字列値および非XML値を定義する規則について調べることができる。

ここに示す変換ルールは、SQL標準の変換ルールとは異なります。

指定された行に対してパス式が空のノードセットを返す場合 (通常は一致しない場合) 、default_expressionが指定されていない限り、列はNULLに設定され、その式を評価した結果の値が使用されます。

default_式は、xmltableが呼び出されたときにすぐに評価されるのではなく、列にデフォルトが必要になるたびに評価されます。 式が安定または不変であるとみなされる場合、反復評価はスキップされ得る。 つまり、default_expressionnextvalのような揮発性関数を有効に使用できます。

列は、NOT NULLとマークされ得る。 NOT NULL列のcolumn_expressionが何も一致せず、DEFAULTがない場合、またはdefault_expressionもnullと評価される場合、エラーが報告されます。

例:

SELECTとしてテーブルxmldataを作成する
    xml $$
    <ROWS>
      <ROW id="1">
        <COUNTRY_ID>AU</COUNTRY_ID>
        <COUNTRY_NAME> アメリカ </COUNTRY_NAME>
      </ROW>
      <ROW id="5">
        <COUNTRY_ID>JP</COUNTRY_ID>
        <COUNTRY_NAME> 日本 </COUNTRY_NAME>
        <PREMIER_NAME> 安倍晋三 </PREMIER_NAME>
        <SIZE unit="sq_mi">145935</SIZE>
      </ROW>
      <ROW id="6">
        <COUNTRY_ID>SG</COUNTRY_ID>
        <COUNTRY_NAME> シンガポール </COUNTRY_NAME>
        <SIZE unit="sq_km">697</SIZE>
      </ROW>
    </ROWS>
    $$ ASデータ;

    SELECT xmltable。*
      xmldataから、
           XMLTABLE('// ROWS/ROW')
                    PASSINGデータ
                    COLUMNS id int PATH '@ id' 、
                            秩序のための条例、
                            「COUNTRY_NAME」テキスト、
                            country_idテキストPATH 'COUNTRY_ID' 、
                            size_sq_km float PATH 'SIZE[@ unit = "sq_km"]'、
                            size_otherテキストパス
                                 'concat(SIZE[@ unit!="sq_km"] 、"" 、SIZE[@ unit!="sq_km"]/@ unit)'、
                            premier_nameテキストPATH 'PREMIER_NAME 'DEFAULT' 指定されていません ');

     id | ordinality | COUNTRY_NAME | country_id | size_sq_km | size_other | premier_name
    ----+------------+--------------+------------+------------+--------------+---------------
      1 | 1 | America | US | | | 指定なし
      5 | 2 | 日本 | JP | | 145935 sq_mi | 安倍晋三
      6 | 3 | シンガポール | SG | 697 | | 指定され
ていません

次の例は、複数のテキスト () ノードの連結、XPathフィルターとしての列名の使用、空白、XMLコメント、および処理手順の処理を示しています。

SELECTとしてTABLE xmlelementsを作成する
    xml $$
      <root>
       <element> こんにちは <!-- xyxxz -->2a2<?aaaaa?> <!-- x --> bbb<x>xxx</x>CC </element>
      </root>
    $$ ASデータ;

    SELECT xmltable。*
      xmlelementsから、XMLTABLE('/root' PASSING data COLUMNS要素テキスト);
             要素
    -------------------------
       Hello2a2 bbbxxxCC 

次の例は、XMLNAMESPACES句を使用して、XMLドキュメントおよびXPath式で使用される名前空間のリストを指定する方法を示しています。

WITH xmldata (データ) AS (値 (')
    <例xmlns=" http://example.com/myns " xmlns:B=" http://example.com/b ">
     <item foo="1" B:bar="2"/>
     <item foo="3" B:bar="4"/>
     <item foo="4" B:bar="5"/>
    </example>'::xml)
    )
    SELECT xmltable。*
      XMLTABLEから (XMLNAMESPACES('http:// example.com/myns' AS x,
                                  'http:// example.com/b' AS "B") 、
                 '/x:example/x:item'
                    通過 (xmldataからデータを選択)
                    COLUMNS foo int PATH '@ foo' 、
                      バーint PATH '@ B:bar');
     foo | バー
    -----+-----
       1 | 2
       3 | 4
       4 | 5
    (3行) 

テーブルをXMLにマッピング

次の関数は、リレーショナルテーブルの内容をXML値にマップします。 これらは、XMLエクスポート機能と考えることができます。

table_to_xml ( table regclass, nulls boolean,
                   tableforestブール値、targetnsテキスト) → xml
    query_to_xml (クエリテキスト、nullブール値、
                   tableforestブール値、targetnsテキスト) → xml
    cursor_to_xml ( cursor refcursor, count integer, null boolean,
                    tableforestブール値、targetnsテキスト) → xml 

table_to_xmlは、パラメーターtableとして渡される名前付きテーブルのコンテンツをマップします。 regclass型は、オプションのスキーマ修飾や二重引用符など、通常の表記法を使用してテーブルを識別する文字列を受け入れます。query_to_xmlは、テキストがパラメーターqueryとして渡されるクエリを実行し、結果セットをマップします。cursor_to_xmlは、パラメーターcursorで指定されたカーソルから指定された行数を取得します。 結果の値は各関数によってメモリに構築されるため、大きなテーブルをマッピングする必要がある場合は、このバリアントをお勧めします。

tableforestがfalseの場合、結果のXMLドキュメントは次のようになります。

<tablename>
      <row>
        <columnname1> データ </columnname1>
        <columnname2> データ </columnname2>
      </row>

      <row>
        ...
      </row>

      ...
    </tablename> 

tableforestがtrueの場合、結果は次のようなXMLコンテンツフラグメントになります。

<tablename>
      <columnname1> データ </columnname1>
      <columnname2> データ </columnname2>
    </tablename>

    <tablename>
      ...
    </tablename>

    ...

使用可能なテーブル名がない場合、つまりクエリまたはカーソルをマッピングするときに、文字列tableが最初の形式で使用され、が2番目の形式で使用されます。

これらのフォーマット間の選択はユーザ次第である。 第1のフォーマットは適切なXML文書であり、これは多くのアプリケーションにおいて重要である。 2番目の形式は、結果値が後で1つのドキュメントに再アセンブルされる場合、cursor_to_xml関数でより便利になる傾向があります。 上述のXMLコンテンツを生成するための関数、特にxmlelementを使用して、結果を好みに合わせて変更することができる。

データ値は、上記の関数xmlelementについて説明したのと同じ方法でマッピングされる。

nullsパラメーターは、null値を出力に含めるかどうかを決定します。 trueの場合、列のnull値は次のように表されます。

<columnname xsi:nil="true"/>

ここで、xsiはXMLスキーマインスタンスのXML名前空間プレフィックスです。 適切な名前空間宣言が結果値に追加されます。 falseの場合、null値を含む列は単に出力から省略されます。

targetnsパラメーターは、結果の目的のXML名前空間を指定します。 特定の名前空間が必要ない場合は、空の文字列を渡す必要があります。

次の関数は、上記の対応する関数によって実行されるマッピングを説明するXMLスキーマドキュメントを返します。

table_to_xmlschema ( table regclass、null boolean、
                         tableforestブール値、targetnsテキスト) → xml
    query_to_xmlschema (クエリテキスト、nullブール値、
                         tableforestブール値、targetnsテキスト) → xml
    cursor_to_xmlschema ( cursor refcursor, nulls boolean,
                          tableforestブール値、targetnsテキスト) → xml 

一致するXMLデータマッピングとXMLスキーマドキュメントを取得するには、同じパラメータを渡すことが不可欠です。

次の関数は、XMLデータマッピングと対応するXMLスキーマを1つのドキュメント (またはフォレスト) で作成し、リンクします。 それらは、自己完結型で自己記述型の結果が求められる場合に役立ちます。

table_to_xml_and_xmlschema ( table regclass, null boolean,
                                 tableforestブール値、targetnsテキスト) → xml
    query_to_xml_and_xmlschema (クエリテキスト、nullブール値、
                                 tableforestブール値、targetnsテキスト) → xml 

さらに、スキーマ全体または現在のデータベース全体の類似のマッピングを生成するには、次の関数を使用できます。

schema_to_xml (スキーマ名、null boolean、
                    tableforestブール値、targetnsテキスト) → xml
    schema_to_xmlschema (スキーマ名, null boolean,
                          tableforestブール値、targetnsテキスト) → xml
    schema_to_xml_and_xmlschema (スキーマ名、nullブール値、
                                  tableforestブール値、targetnsテキスト) → xml

    database_to_xml ( nullブール値、
                      tableforestブール値、targetnsテキスト) → xml
    database_to_xmlschema ( nullブール値、
                            tableforestブール値、targetnsテキスト) → xml
    database_to_xml_and_xmlschema ( nullブール値、
                                    tableforestブール値、targetnsテキスト) → xml 

これらの関数は、現在のユーザーが読み取りできないテーブルを無視します。 さらに、データベース全体の関数は、現在のユーザーがUSAGE (ルックアップ) 特権を持たないスキーマを無視します。

これらは潜在的に多くのデータを生成し、メモリに蓄積する必要があることに注意してください。 大規模なスキーマまたはデータベースのコンテンツマッピングを要求する場合、場合によってはカーソルを介しても、テーブルを個別にマッピングすることを検討する価値があります。

スキーマコンテンツマッピングの結果は次のようになります。

<schemaname>

    table1-mapping

    table2-mapping

    ...

    </schemaname> 

テーブルマッピングの形式は、上記のようにtableforestパラメーターに依存します。

データベースコンテンツマッピングの結果は次のようになります。

<dbname>

    <schema1name>
      ...
    </schema1name>

    <schema2name>
      ...
    </schema2name>

    ...

    </dbname> 

ここで、スキーママッピングは上記のとおりです。

これらの関数によって生成された出力を使用する例として、次の例は、table_to_xml_and_xmlschemaの出力を、テーブルデータの表形式表現を含むHTMLドキュメントに変換するXSLTスタイルシートを示しています。 同様に、これらの関数からの結果は、他のXMLベースのフォーマットに変換することができる。

<?xml version="1.0"?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl=" http://www.w3.org/1999/XSL/Transform "
        xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
        xmlns=" http://www.w3.org/1999/xhtml "
    >

      <xsl:output method="xml"
          doctype-system=" http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd "
          doctype-public="-// W3C/DTD XHTML 1.0厳密 // EN"
          インデント="yes"/>

      <xsl:template match="/*">
        <xsl: 変数名="schema" select="// xsd:schema"/>
        <xsl: 変数名="tabletypename"
                      select="$schema/xsd:element[@ name=name(current())]/@ type"/>
        <xsl: 変数名="rowtypename"
                      select="$schema/xsd:complexType[@ name=$tabletypename]/xsd:sequence/xsd:element[@ name='row']/@ type"/>

        <html>
          <head>
            <title><xsl:value-of select="name(current())"/></title>
          </head>
          <body>
            <テーブル>
              <tr>
                <xsl:for-each select="$schema/xsd:complexType[@ name=$rowtypename]/xsd:sequence/xsd:element/@ name">
                  <th><xsl: select="."/> の値 </th>
                </xsl:for-each>
              </tr>

              <xsl:for-each select="row">
                <tr>
                  <xsl:for-each select="*">
                    <td><xsl: select="."/> の値 </td>
                  </xsl:for-each>
                </tr>
              </xsl:for-each>
            </table>
          </body>
        </html>
      </xsl: テンプレート>

    </xsl:stylesheet> 

最上位レベルに複数の要素ノードを含むか、要素の外側に空白でないテキストを含む結果は、コンテンツフォームの例です。 XPathの結果は、例えば、それが包含要素から選択された属性ノードを返す場合、両方の形式とすることができる。 結果はコンテンツフォームに入力され、許可されていない各ノードは、XPath 1.0文字列関数で定義されている文字列値に置き換えられます。

XMLSERIALIZE

説明

この関数は、value_exprの内容を含む文字列またはLOBを作成するために使用されます。

説明
  • DOCUMENTが指定されている場合、value_exprは有効なXMLドキュメントである必要があります。

  • CONTENTが指定されている場合、value_exprは単一のルートXMLドキュメントである必要はありません。 ただし、有効なXMLコンテンツである必要があります。

  • 指定されたデータ型は、文字列型 (VARCHAR2またはVARCHAR、ただしNVARCHARまたはNVARCHAR2ではありません) またはCLOBです。 デフォルト値はCLOBです。

構文

XMLSERIALIZE({ドキュメント | CEONTENT} value_expr [AS DATATYPE])

パラメーター

パラメーター

説明

{ドキュメント | CEONTENT}

value_exprがコンテンツかドキュメントかを指定するために使用します。

value_expr

パラメーター式を入力します。

[データとして]

オプション。入力パラメーター式の変換先の型を指定します。

戻り値の型

文字列型データまたはLOB型データを返します。

SELECT xmlserialize (char(10) としてコンテンツ 'good') DUALから;
 xmlserialize
--------------
 良いです 

XMLROOT

説明

この関数は、既存のXML値およびXMLルート情報にバージョンおよび独立属性を提供することによって、新しいXML値の作成を可能にする。 value_exprに既にprologがある場合、データベースはエラーを返します。 入力がnullの場合、関数はnullを返します。

説明
  • 最初の値 _exprは、prolog情報を提供するXML値を指定します。

  • VERSION句では、value_exprは有効なXMLバージョンを表す文字列に解決する必要があります。 VERSIONに「NO VALUE」が指定されている場合、バージョンはデフォルトで1.0になります。

  • オプションのSTANDALONE句が省略されている場合、またはNO VALUEで指定されている場合、関数によって返される値に独立したプロパティはありません。

構文

XMLROOT(value_expr、VERSION {value_expr | NO VALUE} [, STANDALONE {YES | NO | NO VALUE}])

パラメーターの説明

パラメーター

説明

value_expr

パラメーター式。

バージョン {value_expr | 値なし}

バージョンを指定します。 NO VALUEを指定した場合、バージョンはデフォルトで1.0になります。

STANDALONE {はい | いいえ | 値なし}

オプションで、NO VALUEとして指定または指定されていない場合、独立した属性はありません。

戻り値の型

XMLデータ型を <?xml version = "version" \[ STANDALONE = "{yes | no}" \]?> の形式で返します。

SELECT xmlroot(xml '<foo/>' 、バージョンなし値、スタンドアロンはい) DUALから;
 xmlroot
 ----------------------------------------------
 <?xml version="1.0" standalone="yes" ?>< foo/> 

XMLPI

説明

この関数は、識別子の評価結果とオプションのvalue_exprからXML処理命令を生成します。 処理命令は、通常、XML文書の全部または一部に関連する情報をアプリケーションに提供するために使用される。 アプリケーションは、処理命令を使用して、XMLドキュメントを最適に処理する方法を決定します。

説明

XMLPIには次の制限があります。

  • 識別子は、処理命令の有効なターゲットでなければならない。

  • いかなる状況においても、識別子に対してXMLの組み合わせを指定することはできない。

  • 識別子に連続文字を含めることはできませんか? >)。

構文

XMLPI([NAME] identifier[, value_expr])

パラメーターの説明

パラメーター

説明

value_expr

パラメーター式は、文字列として解析する必要があります。

戻り値の型

データ型XMLを再実行します。

SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css" ');
 xmlpi
 -------------------------------------------------------
 <?xml-stylesheet href="mystyle.css" type="text/css"?> 

XMLPARSE

説明

この関数は、value_exprの計算結果に基づいてXMLインスタンスを解析して生成します。 value_exprは文字列として解析する必要があります。 value_exprnullに解決された場合、関数はnullを返します。

構文

XMLPARSE({ドキュメント | コンテンツ}, value_expr[, WELLFORMED])

パラメーター

パラメーター

説明

ドキュメント

オプションで、DOCUMENTを選択した場合は、value_exprを1つのXMLドキュメントに解析する必要があります。

コンテンツ

オプションで、CONTENTを選択した場合、value_exprを有効なXML値に解析する必要があります。

value_expr

パラメーター式。

溶接される

オプションの場合、WELLFORMEDを指定すると、この変数を指定すると、value_exprが正しくフォーマットされたXMLドキュメントに解析されるため、データベースは入力フォーマットが正しいことを確認するための妥当性チェックを実行しません。

戻り値の型

XMLインスタンスを返します。

SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/no.such.file">]><foo>&c;</foo>');
                               xmlparse
-----------------------------------------------------------------------
 <!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/no.such.file">]><foo>&c;</foo> 

XMLFOREST

説明

この関数は、各引数をXMLに変換し、変換された引数を連結したXMLフラグメントを返します。

説明
  • value_exprがスカラー式の場合、AS句は省略でき、Oracle Databaseは列名を要素名として使用します。

  • value_exprがオブジェクト型またはコレクションの場合、AS句は必須であり、Oracleは指定されたc_aliasを囲みトークンとして使用します。 エイリアス (_Alias) には最大4000文字を使用できます。

  • value_exprがnullの場合、value_experの要素は作成されません。

構文

XMLFOREST(value_expr [AS c_alias] [, value_expr [AS c_alias], ...])

パラメーターの説明

項目

説明

value_expr

パラメーター式。

c_alias

オプション、エイリアス、value_exprがオブジェクト型またはコレクションの場合に必要です。

戻り値の型

XML型の連結を返します。

CREATE TABLE testxmlschema.test3
 SELECT true c1として、
 true::testboolxmldomain c2、
 '2013-02-21 '::date c3、
 '2013-02-21 '::testdatexmldomain c4;
 SELECT xmlforest(c1、c2、c3、c4) testxmlschema.test3; から
 xmlforest
 ------------------------------------------------------------------
 <c1>true</c1><c2>true</c2><c3>2013-02-21</c3><c4>2013-02-21</c4> 

XMLCONCAT

説明

XMLConcatは一連のXMLTypeインスタンスを入力として受け取り、行ごとに一連の要素を連結し、連結された系列を返します。 XMLConcatはXMLSequenceの反対です。 null式は結果から削除されます。 すべての値式がnullの場合、関数はnullを返します。

構文

XMLCONCAT(XMLType_instance[, XMLType_instance, ...])

パラメーターの説明

項目

説明

XMLType_instance

XMLTypeの例を指定します。

戻り値の型

接続された一連のXMLTypeインスタンスを返します。

DUALからのSELECT xmlconcat('hello' 、'you');
 xmlconcat
 -----------
 helloyou 

抽出値

説明

この関数は、XMLTypeインスタンスとXPath式をパラメーターとして受け取り、結果のノードのスカラー値を返します。 結果は単一のノードで、テキストノード、属性、または要素でなければなりません。 結果が要素の場合、要素は子として単一のテキストノードを持つ必要があり、これは関数によって返される値です。 初期スラッシュを使用して絶対XPath_stringを指定することも、初期スラッシュを省略して相対XPath_stringを指定することもできます。 最初のスラッシュを省略した場合、相対パスのコンテキストはデフォルトでルートノードになります。 指定されたXPathが複数の子ノードを持つノードを指す場合、または非テキストノードの子を持つノードを指す場合、エラーが返されます。 オプションのnamespace_stringは、XPath式を評価するときに使用するプレフィックスのデフォルトマッピングまたは名前空間マッピングを指定するVARCHAR2値に解決する必要があります。

構文

EXTRACTVALUE(XML Type_instance, XPath_string[, namespace_string])

パラメーター

パラメーター

説明

XMLType_instance

XMLドキュメントを含むXMLTypeインスタンスを指定します。

XPath_string

VARCHAR2型。パスを指定します。

namespace_string

オプションのVARCHAR2型で、namespace_stringパラメーターのデフォルトはルート要素の名前空間です。 Xpath_stringの子要素を参照する場合、namespace_stringを指定し、両方のパラメーターで "who" プレフィックスを指定する必要があります。

戻り値の型

XMLスキーマベースのドキュメントでは、戻り値の型を推測できる場合、適切な型のスカラー値が返されます。 それ以外の場合、結果はVARCHAR2型です。 XMLスキーマに基づいていないドキュメントの場合、Return型は常にVARCHAR2です。

SELECT warehouse_name, 
   EXTRACTVALUE(e.warehouse_spec, '/Warehouse/Docks')
   「ドック」
   倉庫からe 
   warehouse_specがNULLではない場合。WAREHOUSE_NAMEドック
-------------------- ------------
テキサス州サウスレイク2
サンフランシスコ1
ニュージャージー州
シアトル、ワシントン3 

EXISTSNODE

説明

この関数は、指定されたパスを使用してXMLドキュメントをトラバースする際にノードが存在するかどうかを判断します。 XMLドキュメントを含むXMLTypeインスタンスと、パスを指定するVARCHAR2型のXPath文字列をパラメーターとして受け取ります。 オプションのnamespace_stringは、XPath式を評価するときにOracle Databaseが使用するプレフィックスのデフォルトマッピングまたは名前空間マッピングを指定するVARCHAR2値に解決する必要があります。

  • XPathを通過した後、ノードがない場合は戻ります。

  • ノードがある場合は0を返します。

構文

EXISTSNODE(XMLType_instance, XPath_string[, namespace_string])

パラメーター

パラメーター

説明

XMLType_instance

XMLドキュメントを含むXMLTypeインスタンスを指定します。

XPath_string

VARCHAR2型。パスを指定します。

namespace_string

オプションのVARCHAR2型で、namespace_stringパラメーターのデフォルトはルート要素の名前空間です。 Xpath_stringの子要素を参照する場合、namespace_stringを指定し、両方のパラメーターで "who" プレフィックスを指定する必要があります。

戻り値の型

データ型BOOLEANを再実行します。

SELECT warehouse_id, warehouse_name
  倉庫から
  WHERE EXISTSNODE(warehouse_spec、'/Warehouse/Docks') = 1
  warehouse_idによるORDER;
 warehouse_id | warehouse_name
-------------- ---------------------
            1 | Southlake, テキサス州
            2 | サンフランシスコ
            4 | シアトル, ワシントン 

DELETEXML

説明

この関数は、XMLドキュメント内のXPath式を満たすXMLノードを削除するために使用されます。 XMLType型のXMLドキュメントとVARCHAR2型のXPath文字列を受け取り、パスをパラメーターとして指定します。

XMLドキュメントをトラバースした後、XPath式を満たすXMLノードがある場合、ノードを削除した後のXMLドキュメントが返されます。そのようなノードがない場合、元のXMLドキュメントが返されます。

構文

DELETEXML(XMLType_instance, XPath_string)

パラメーターの説明

項目

説明

XMLType_instance

XMLType型のXMLドキュメント。

XPath_string

VARCHAR2型。パスを指定します。

戻り値の型

データ型XMLTypeを再実行します。

テーブルセクションの作成
SELECT XMLTYPE('<セクション>
<question questionID="1">
<answer> 米国 </answer>
<answer>XX</answer>
</question>
</section>') section_xml FROM dual;
-- すべてのノードを削除
セクションの更新
SET s.section_xml = deleteXML(s.section_xml、'// question[@ questionID=1]/answer[2]');
セクションsからのSELECT s.section_xml;
section_xml
---------------------------
<セクション> +
<question questionID="1">+
<answer> 米国 </answer> +
+
</question> +
</section> +

(1行) 

INSERTCHILDXML

説明

この関数は、XPath式を満たすXMLノードの特定の子ノードの後に新しいXMLノードを挿入するために使用されます。 XMLType型のXML文書、パスを指定するVARCHAR2型のXPath文字列、VARCHAR2型の子ノードラベル、XMLType型の挿入対象のXMLノードをパラメータとして取ります。

  • XMLドキュメントをトラバースした後、XPath式を満たすXMLノードがあり、そのノードに指定された子ノードラベルと一致するラベルがある場合は、指定されたXMLを、子ノードラベルを満たす最後の子ノードの後に挿入します。 node.

  • XMLドキュメントをトラバースした後、XPath式を満たすXMLノードがあるが、ノードの子ノードのラベルが所与の子ノードのラベルと一致している場合、ノードの最後に、所与のXMLノードが子ノードとして挿入される。

構文

INSERTCHILDXML(XMLType_instance, XPath_string, Node_string, XMLType_instance)

パラメーターの説明

項目

説明

XMLType_instance

XMLTyp型のXMLドキュメント。

XPath_string

VARCHAR2型。パスを指定します。

Node_string

VARCHAR2型、子ノードのラベル。

XMLType_instance

XMLType型のXMLノード。

戻り値の型

データ型XMLTypeを再実行します。

テーブルセクションの作成
SELECT XMLTYPE('<セクション>
<question questionID="1">
<answer> 米国 </answer>
<answer>XX</answer>
</question>
</section>') section_xml FROM dual;
-- すべてのノードを削除
セクションの更新
SET s.section_xml = deleteXML(s.section_xml、'// question[@ questionID=1]/answer[2]');
セクションsからのSELECT s.section_xml;
section_xml
---------------------------
<セクション> +
<question questionID="1">+
<answer> 米国 </answer> +
+
</question> +
</section> +

(1行)