4 XQueryとOracle XML DB

XQuery言語は、Oracle XML DBのXMLデータと対話する主な方法の1つです。この言語でのサポートには、SQL*PlusコマンドXQUERYおよびSQL/XML関数XMLQueryXMLTableXMLExistsおよびXMLCastがあります。

4.1 XQuery言語の概要

XQueryはXMLデータの問合せおよび更新のために設計されたW3C言語です。

Oracle XML DBでは、次のW3C XQuery標準をサポートしています。

  • XQuery 1.0勧告

  • XQuery Update Facility 1.0勧告

  • XQuery and XPath Full Text 1.0勧告

この項では、XQuery言語の概要を示します。詳細は、この言語に関する最新の書籍や、それを定義している標準に関する文書(すべてhttp://www.w3c.org/から入手可能)を参照してください。

4.1.1 XQuery式に含まれるXPath式

XPath言語はXML文書をナビゲートするためのW3C勧告です。そしてXQuery言語のサブセットです。つまり、XPath式もXQuery式です。

XPathはXML文書をノードのツリーとしてモデル化します。このツリーを移動し、述語およびノード・テスト機能を適用するための一連の操作が備わっています。XPath式をXML文書に適用すると、ノードのセットが戻されます。たとえば、式/PO/PONOは、文書のPOルート要素の下にあるすべてのPONO子要素を選択します。

表4-1に、XPathで使用する共通構造体を示します。

表4-1 XPathの共通構造体

XPath構造体 説明

/

XPath式のツリーのルートを示します。たとえば、/PO は、名前がPOであるルート・ノードの子を示します。

/

指定された要素ノードの子要素ノードを識別するためのパス区切りとして使用します。たとえば、/PurchaseOrder/Referenceは、ルート要素の子であるPurchaseOrder要素の子、Reference要素を示します。

//

現行ノードのすべての子孫を識別するために使用します。たとえば、PurchaseOrder//ShippingInstructionsは、PurchaseOrder要素の下にあるすべてのShippingInstructions要素と一致します。

*

任意の子ノードと一致させるためのワイルド・カードとして使用します。たとえば、/PO/*/STREETは、PO要素の孫であるすべての「STREET」要素と一致します。

[ ]

述語式を示すために使用します。XPathはORANDNOTなど、様々なバイナリ演算子をサポートしています。たとえば、/PO[PONO=20 AND PNAME="PO_2"]/SHIPADDRは、発注書番号が20で、発注書名がPO_2であるすべての発注書の出荷先要素を選択します。

大カッコは、位置(索引)を示す場合にも使用します。たとえば、/PO/PONO[2]は、POルート要素の下の2番目の発注書番号要素を示します。

関数

XPathおよびXQueryは、substringroundnotなどの一連の組込み関数をサポートしています。さらに、これらの言語では名前空間を使用することで拡張関数を利用できます。Oracle XQuery拡張関数では、名前空間http://xmlns.oracle.com/xdbに名前空間接頭辞oraを使用します。Oracle XQuery拡張関数を参照してください。

XPath式は単一のノードまたは一連の要素、テキストまたは属性ノードを識別する必要があります。XPath式の評価結果はブール式にはできません。

XMLTypeデータは、PL/SQL、CまたはJavaを使用して選択できます。XMLTypeメソッドgetNumberVal()を使用して、XMLデータをNUMBER値として取得することもできます。

注意:

Oracle SQL関数およびXMLTypeメソッドは、W3C XPath勧告に準拠しています。このことは、XPath式がどのノードもターゲットにしていない場合にXMLデータに適用されると、空のシーケンスが戻される必要があることを示します。この場合にエラーが発生してはいけません

4.1.2 XQuery: シーケンスに基づく関数言語

XQueryは多くの点でSQLに類似していますが、SQLが単に構造化されたリレーショナル・データを問い合せるために設計されているのに対し、XQueryは、様々なデータ・ソースの半構造化されたXMLデータを問い合せるために特に設計されています。

XQueryは、XMLデータがあれば、Webサービスからアクセスできるデータベース表に格納されているか、他の方法でその場で作成されるかに関係なく、XMLデータを問い合せるためにいつでも使用できます。XMLデータの問合せの他に、XQueryはXMLデータの構成にも使用できます。この点で、XQueryはXSLTやその他のSQL/XMLパブリッシング関数(XMLElementなど)の代用として使用できます。

XQueryは、XML Information Set (Infoset)データ・モデルとXML Schema型体系を統合した、Post-Schema-Validation Infoset (PSVI)データ・モデルに基づいています。XQueryは、シーケンスに基づく新しいデータ・モデルであるXQueryデータ・モデル(XDM)を定義します。XQueryシーケンスはXDMインスタンスとも呼ばれます。

4.1.2.1 XQueryとシーケンス

XQueryは常にシーケンスの操作に関わります。このためXQueryは集合操作言語に類似しています。ただしシーケンスは順序付けされていて、重複項目を含むことができる点が異なります。XQueryシーケンスが他の言語のシーケンスと異なる点は、ネストされたXQueryシーケンスは実際の効果において常にフラット化されるという点です。

多くの場合、シーケンスを順序のないものとして処理することにより最適化を促進できます。ただしそれは可能な場合に限られ、ユーザーの責任となります。この順序なしモードは、ネストされた反復(for)の処理で順序を結合する場合や、XPath式を処理する場合に適用できます(たとえば/a/bでは、一致するb要素は文書順序に関係なく処理できます)。

XQueryシーケンスはゼロ個以上の項目から構成されています。項目は、アトム型(スカラー)の値またはXMLノードです。項目は、XML Schemaの型に基づくリッチ型体系を使用して型指定されます。この型体系は、ブール、数値、および文字列といった単純なスカラー型に制限されていたXPath 1.0から大きく変更された部分です。

4.1.2.2 参照が透過的なXQuery

XQueryは関数言語です。このため、評価され、その評価によって(結果)が戻される、実行可能なの集合からなります。

XQuery式の評価結果は2つの部分、つまり(a)シーケンス(XDMインスタンス)と(b)更新の保留中リストで構成され、少なくともどちらかは空です。簡単に説明すると、シーケンスは式の値と呼ばれることがあり、特に更新の保留中リストが空の場合は、実行するデータ更新がないことを意味します。

XQueryは関数言語なので、参照が透過的でもあります。つまり、同じコンテキストで評価された同じ式は、同じ値を戻します。

こうした数学的長所の例外には、次のものがあります。

  • 外部環境との相互作用から値を導出するXQuery式。たとえば、fn:current-time(...)またはfn:doc(...)といった式は常に同じ値を戻すとはかぎりません。これは、それらの式が、変化する外部の条件に依存しているためです(時刻の変化、ターゲット文書のコンテンツの変化)。

    fn:docのような場合には、XQueryは単一の問合せの実行の内部で参照が透過的なものと定義されます。単一の問合せの内部では、同じ引数を伴うfn:docの呼出しは、同じ文書を結果とします。

  • 個別のXQuery言語の実装に依存するものとして定義されているXQuery式。そうした式の評価結果は、実装に応じて異なる場合があります。関数fn:docは、本質的に実装により定義される関数の例です。

XQuery Updateは、参照の透過性の例外に該当しないため、リストには含まれません。詳細は、データに対するXQuery Updateの副次的な影響を参照してください。

参照の透過性は、XQuery変数にも適用されます。同じコンテキストでの同じ変数は同じ値を持ちます。関数言語はこの点で、数学で言う形式主義に似ており、手続き型、または命令型のプログラミング言語とは異なっています。手続き型言語の変数は、実際にはメモリー位置の名前で、現在の値や状態を持っており、任意の時点におけるその内容により表現されます。XQueryなど宣言型言語における変数は、実際には静的な値の名前です。

4.1.2.3 データに対するXQuery Updateの副次的な影響

参照の透過性は、XQuery式の評価に適用されます。ただし、この評価によってユーザーのデータ副次的な影響がまったく生じないわけではありません。特に、XQuery Updateを使用してデータを変更する場合です。その変更内容は、XQueryの更新式を評価した結果の副次的な影響です。

ただし、副次的な影響と式の値とは異なります。評価から戻される値には更新の保留中リストが含まれ、それには実行する更新が記載されています。所定のXQuery式では、評価のコンテキストに関係なく(前述の例外はありますが)、この記載内容は同じです。

XQuery Update標準では、データのXDMインスタンスの更新方法を定義します。これらの更新内容が永続的なデータ・ストア(XMLType表および列など)に伝播される方法は実装に依存します。

4.1.2.4 XQuery Updateのスナップショット

XQuery式(問合せ)では、複数の更新操作をコールできます。XQuery Updateでは、同じ問合せでのこのような操作はすべてアトミック操作として実行され、すべて成功するか、またはすべて失敗するか(エラーが発生した場合)のいずれかになります。

つまり、変更の単位はXQuery問合せ全体です。このアトミックな更新動作を実現するため、XQuery Updateでは、問合せを評価する前に、問合せによってコールされる変更対象のデータ(XDMインスタンス)のスナップショットを取得します。問合せによってコールされる更新操作を更新の保留中リストに追加します。スナップショットは、更新ターゲットであるXDMインスタンスの評価コンテキストです。

XQuery式を評価する最後のステップとして、更新の保留中リストが処理され、指示された更新操作をアトミックに適用して、スナップショットを終了します。

スナップショット・セマンティクスのアトミック性は、指定された問合せで使用されている一連の更新操作が記載順に適用されるとはかぎらないことを意味します。実際には、更新操作の適用順序は、XQuery Update機能の標準によって固定および指定されます。

つまり、更新操作では同じ問合せにおける他の更新操作の結果を確認しません。中間的または暫定的な更新の状態という概念はなく、問合せの更新操作はすべてまとめてアトミックに適用されます。

4.1.2.5 XQuery Full Textの全文検索機能

XQuery and XPath Full Text 1.0勧告(XQuery Full Text)では、問合せでの全文検索に対するXQueryサポートを定義しています。それは、検索を実行してAllMatchesモデルのインスタンスを戻す全文選択の演算子を定義して、XQuery Data Model (XDM)を補完します。

AllMatchesインスタンスには、指定された検索コンテキスト項目の全文問合せに対して実行可能なすべての解決が記述されます。各解決はMatchインスタンスに記述され、それには含む必要のある検索のコンテキスト・トークン(StringIncludeインスタンス)と除外する必要のあるStringExcludeインスタンスが含まれます。

簡単にいえば、XQuery Full Textはcontains全文式をXQuery言語に追加します。このような式を問合せで使用して、要素ノードとその子孫要素のテキストを検索します(属性ノードのテキストも検索可能)。

4.1.3 XQuery式

XQuery式では大/小文字が区別されます。XQuery式は、単純式または更新式のいずれかで、後者の式はデータの変更を表します。正確には、実行可能なXQuery式は次のとおりです。

  • 基本更新式: insertdeletereplaceまたはrenameの各式、あるいは更新関数のコール(XQuery Update Facility 1.0勧告を参照)。

  • 更新式: 基本更新式、または別の更新式を含んでいる(変換式以外の)式(これは再帰的定義です)。

  • 単純式: XQuery 1.0式。更新処理はコールしません。

単純式の評価結果として戻される更新の保留中リストは空です。更新式の評価結果として戻されるシーケンス値は空です。

単純式は次のとおりです。

  • 1次式: リテラル、変数または関数アプリケーション。変数名は、たとえば$fooのように、ドル記号($)で始まります。リテラルには、数値、数値、文字、または実体参照。

  • XPath式: 任意のXPath式。XPath 2.0標準はXQueryのサブセットになります。

  • FLWOR式: 最も重要なXQuery式で、次の要素を順番に並べたもので構成されています。FLWORという名もそれに由来しています。forletwhereorder byreturn

  • XQueryシーケンス: カンマ(,)コンストラクタはシーケンスを作成します。unionintersectといったシーケンス操作関数も使用できます。XQueryシーケンスはすべて、事実上フラットです。ネストされたシーケンスは、フラット化された同等のものとして処理されます。このため、たとえば(1, 2, (3, 4, (5), 6), 7)(1, 2, 3, 4, 5, 6, 7)として処理されます。(42)などの単一シーケンスは、大部分のXQueryコンテキストで、単一項目42と同じ動作をします。前述のように、任意のXQuery式の結果はシーケンスです。

  • 直接(リテラル)構成: XML要素と属性の構文により、要素と属性が自動的に構成されます。構文に表記したとおりに使用されることになります。たとえば、XQuery式<a>33</a>により、XML要素<a>33</a>が構成されます。

  • 計算による(動的)構成: 計算された値を使用して、実行時にXMLデータを構成できます。たとえば、次のXQuery式によりこのXMLデータ<foo toto="5"><bar>tata titi</bar> why? </foo>が構成されます。

    <foo>attribute toto {2+3},
         element bar {"tata", "titi"},
         text {" why? "}</foo>
    

    この例では、要素fooが直接構成で、他の部分の構成は計算されたものです。実践では、計算されるコンストラクタの引数はリテラル(toto"tata"など)ではなく式(2+3など)で、評価されます。要素や属性コンストラクタの名前と値引数は、どちらも計算できます。中カッコ({, })は、XQuery式を評価対象外にするのに使用します。

  • 条件式: 通常どおりですが、式の各部分が任意の式になることに注意してください。たとえば、この条件式では、任意のXQuery式が各部分式(somethingsomethingElseexpression1、およびexpression2)に入ります。

     if (something < somethingElse) then expression1 else expression2
    
  • 数式、リレーショナル式: 通常どおりですが、各リレーショナル式が(ブール脚注1)値を戻すことに注意してください。例:

    2 + 3
    42 < $a + 5
    (1, 4) = (1, 2)
    5 > 3 eq true()
    
  • 量化式: 全称(every)および存在(some)関数を使用してFLWOR式を簡単に使用できる場合があります。例:

    every $foo in doc("bar.xml")//Whatever satisfies $foo/@bar > 42
    some $toto in (42, 5), $titi in (123, 29, 5) satisfies $toto = $titi
    
  • 正規表現: XQueryの正規表現はXML Schema1.0およびPerlに基づいています。(「XQueryの関数と演算子のサポート」を参照)

  • 型表現: XQuery型を表現するXQuery式。たとえば、item()node()attribute()element()document-node()namespace()text()xs:integerxs:string脚注 2

    型表現は、次のような出現インジケータを持てます。? (オプション。0回または1回)、* (0回以上)、+ (1回以上)。たとえば、document-node(element())*item()+attribute()?

    XQueryには、型と組み合せて使用する演算子もあります。cast ascastable astreat asinstance の、typeswitch、およびvalidateなどです。たとえば、"42" cast as xs:integerは、値が整数の42である式です。(厳密には、値が型を表現していないので、これは型表現ではありません)。

  • contains全文式: 全文検索を表すXQuery式。この式は、XQuery and XPath Full Text 1.0勧告によって提供されます。Oracleがサポートしているcontains全文式(FTContainsExpr)は、検索項目を指定する検索コンテキストと、これらの項目をフィルタ処理し、一致を取り出す全文選択の2つの部分で構成されています。

    選択部分の構成要素は次のとおりです。

    • トークンおよび句(一致で使用)。

    • オプションのmatchオプション(ステミングの使用など)。

    • オプションのブール演算子(全文選択の結合に使用)。

    • オプションの制約演算子(位置フィルタなど。例: ordered window)。

    詳細は、XQuery Full Textのサポートを参照してください。

4.1.4 FLWOR式

XQuery一般について考えた場合、特にFLWOR式には多くの学習事項があります。この項では、概要を簡単に紹介します。

FLWORはXQueryで最も一般的な式構文です。FLWOR(「フラワー」と読みます)は、forletwhereorder by、およびreturnを表しています。FLWOR式には1つ以上のforまたはlet句と、1つのreturn句を持ちます。1つのwhereおよびorder by句がオプションです。更新式を含むことができるのはreturn句のみで、それ以外の句はできません。

  • for: 1つ以上の変数を任意の値に順にバインドします。つまり、各変数に対し反復を行いますが、変数を各回の反復で別の値にバインドします。

    各回の反復で、変数は出現する順にバインドされ、forリストで$laterの前にリストされた変数$earlierの値が、変数$laterのバインドで使用されます。たとえば、次の式は、2回目の反復で$i4にバインドし、$j6(2+4)にバインドします。

     for $i in (3, 4), $j in ($i, 2+$i)
    
  • let: 1つ以上の変数をバインドします。

    forと同様、letでも、letのバインディング・リストで先にリストされている別の変数を使用して(またはforletで囲むことにより)、変数を計算した値にバインドできます。たとえば、次の式は$j5(3+2)にバインドします。

    let $i := 3, $j := $i + 2
    
  • where: forおよびletの変数バインディングを特定の条件に応じてフィルタします。SQLのWHERE句に類似しています。

  • order by: whereフィルタリングの結果をソートします。

  • return: 順序付けとフィルタリングがされた値を構成します。これがFLWOR式の最終的な結果です。フラット化されたシーケンスになります。

    return句に更新式が含まれている場合は、別の句によって生成されたタプルごとに式が評価されます。これらの評価から取得した更新の保留中リストは、FLWOR式の結果としてマージされます。

forletは、SQLのFROM句に対して同じように機能します。式whereは、SQLのWHERE句と同じように機能し、式order byはSQLのORDER BYと似ています。式returnは、SQLのSELECTに似ています。両方の言語で名前が共通している2つのキーワード(whereorder by)を除いて、FLWOR句の順序はSQL句の順序と反対ですが、対応する句の意味は非常に類似しています。

FLWOR式(order byを含む)の使用は、文書の順序と異なる順序でXQueryシーケンスを構成する唯一の方法です。

4.2 Oracle XML DBにおけるXQueryの概要

Oracle XML DBのXQuery言語サポートは、SQL/XML関数XMLQueryXMLTableXMLExistsおよびXMLCastのネイティブ実装により提供されています。便宜性の観点から、SQL*PlusのコマンドXQUERYも用意されており、XQuery式を直接入力することができます。実質的に、このコマンドにより、SQL*PlusはXQueryコマンドライン・インタプリタになります。

Oracle XML DBは、SQL/XML関数XMLQueryXMLTableXMLExistsおよびXMLCastに引数として渡されるXQuery式をコンパイルします。このコンパイルにより、SQL問合せブロックと、SQL/XML関数とXPath関数を使用する演算子ツリーが作成されます。XMLQueryXMLTableXMLExistsまたはXMLCastを含むSQL文は一括してコンパイルおよび最適化され、リレーショナル・データベースとXQuery特有の最適化テクノロジの両方を活用します。使用するXML記憶域と索引付けメソッドにより、XPath関数をさらに最適化することができます。結果として生じる最適化された演算子ツリーは、ストリーム方式で実行されます。

注意:

Oracle XML Developer's Kit (XDK)では、中間層のXQueryをサポートしています。XQueryを使用するためにOracle Databaseにアクセスする必要はありません。XDKによって、XQuery API for Java (XQJ)を使用したXQuery式の評価が可能になります。

関連項目:

4.2.1 XQueryの用途

SQL/XML生成関数またはXSLTを使用して実行される処理には、XQueryを使用して実行できるものが多く、両者の用途は多くの点で一致しています。あるタスクを実行する際にどのツールを使用するかは、様々な考慮事項に基づいて決定されるものであり、その考慮事項の多くはOracle Database以外に関連するものです。このような一般的な問題については、外部のドキュメントを参照してください。

一般的には、XMLデータに主眼を置いている場合はXQueryが使用され、リレーショナル・データに主眼を置いている場合はSQL/XML生成関数(XMLElementXMLAggなど)が使用されます。

他の条件が同じであれば、既存のXML文書から抽出されたフラグメントに基づいて問合せによってXML文書を構成する場合は通常、リレーショナル・データからスカラー値を抽出し、SQL/XML生成関数を使用して目的のXMLデータを構成するよりも、通常はXQueryのFLOWR式が単純になります(そのためコードのメンテナンスも簡単になります)。一方、既存のリレーショナル・データに基づいて問合せによってXML文書を構成する場合は、通常、SQL/XML生成関数を使用する方が適しています。

Oracle XML DBに関しては、SQL/XML生成関数を使用しても、XMLQueryおよびXMLTableを使用しても、期待できるパフォーマンスは、同じ一般的なレベルです。これは、いずれも最適化のリライト対象になります。

4.2.2 事前定義済のXQuery名前空間と接頭辞

いくつかの名前空間と接頭辞は、Oracle XML DBにおけるXQueryで使用するために事前定義されています。

表4-2 事前定義の名前空間と接頭辞

接頭辞 名前空間 説明

ora

http://xmlns.oracle.com/xdb

Oracle XML DB名前空間

local

http://www.w3.org/2003/11/xpath-local-functions

XPathのローカル関数宣言名前空間

fn

http://www.w3.org/2003/11/xpath-functions

XPath関数の名前空間

xml

http://www.w3.org/XML/1998/namespace

XML名前空間

xs

http://www.w3.org/2001/XMLSchema

XML Schema名前空間

xsi

http://www.w3.org/2001/XMLSchema-instance

XML Schemaインスタンス名前空間

これらの接頭辞は、あらかじめXQuery式プロローグで宣言しなくてもXQuery式で使用できます。また、xml以外は、すべてプロローグ内で再定義できます。ora以外の接頭辞はすべて、XQuery標準で事前定義されています。

4.3 SQL/XML関数XMLQUERY、XMLTABLE、XMLExistsおよびXMLCast

SQL/XML関数XMLQueryXMLTableXMLExistsXMLCastは、SQL/XML標準により、SQL言語とXQuery言語の一般インタフェースとして定義されています。

このマニュアルでは、それらはSQL/XMLの問合せおよび更新関数と呼ばれています。他のSQL/XML関数と同様、これらの関数を使用すると、SQLとXML、両方の強力な機能と柔軟性を活用できます。これらの関数を使用すると、リレーショナル・データを使用したXMLデータの構成、XML同様のリレーショナル・データに対する問合せ、およびXMLデータからのリレーショナル・データの構成が可能です。

SQL関数XMLExistsおよびXMLCastについては、この章の別の項で説明します。この項では、関数XMLQueryXMLTableについて説明しますが、この章の例の大半はXMLExistsおよびXMLCastも使用します。一般的な使用方法は次のとおりです。

  • XMLQueryXMLCastは通常、SELECTリストで使用します。

  • XMLTableは一般的にSQLのFROM句で使用します。

  • XMLExistsは通常、SQLのWHERE句で使用します。

XMLQueryXMLTableの両方がXQuery式を評価します。XQuery言語では、式は常に項目のシーケンスを戻します。関数XMLQueryはこのシーケンスの項目を集計し、単一のXML文書または断片を戻します。関数XMLTableは、XQueryシーケンスからの1つの項目を各行に含むSQL表を戻します。

関連項目:

4.3.1 Oracle XML DBのXMLQUERY SQL/XML関数

SQL/XML関数XMLQueryを使用して、XMLデータを構成または問い合せます。

この関数は引数としてXQuery式、文字列としてリテラル、そしてオプションで、XQueryコンテキスト項目をSQL式として取ります。コンテキスト項目は、XQuery式を評価する際のXPathコンテキストを確立します。この他に、XMLQueryは、XQuery式の評価の際にXQuery変数にバインドされた値を持つ任意の数のSQL式を引数として受け取ります。

関数はXQuery式の評価結果をXMLTypeインスタンスとして戻します。

XML_passing_clause ::=

  • XQuery_stringは完結したXQuery式で、プロローグをリテラル文字列として含む場合があります。

  • XML_passing_clauseはキーワードPASSINGに1つ以上のSQL式(expr)を続けたもので、それぞれXMLTypeインスタンスまたはSQLスカラー・データ型の(つまり、オブジェクト・データ型でもコレクション・データ型でもない)インスタンスを戻します。それぞれの式(expr)は、適切にキャストされた表またはビューの列の値、PL/SQL変数、バインド変数のいずれかになります。1つを除いてすべての式では、その後にASおよびXQuery identifierが続いている必要があります。それぞれのexprの評価結果は、対応するidentifierにバインドされ、続いてXQuery_stringが評価されます。AS句に続いていないexprがあった場合、そのexprの評価結果は、XQuery_stringを評価する際のコンテキスト項目として使用されます。Oracle XML DBではBY VALUEを渡すことはできますが、BY REFERENCEは渡せないため、BY VALUE句は暗黙的で、省略可能です。

  • RETURNING CONTENTは、XMLQueryのアプリケーションが戻す値が、パラメータ化されたXML型XML(CONTENT)のインスタンスであり、パラメータ化された型XML(SEQUENCE)のインスタンスではないことを示します。これは拡張Infosetデータ・モデルに準拠した文書フラグメントです。このため、任意の数の子を持つ単一の文書ノードとなります。子はそれぞれ任意のXMLノード型を取ることができ、特に、テキスト・ノードになることが可能です。

    SQL/XML関数XMLQueryでOracle XML DBがサポートするのはRETURNING CONTENT句のみです。RETURNING SEQUENCE句はサポートしていません

XMLTypeの列、表、またはビューは、関数XMLQueryのコンテキスト項目引数として渡すことができます。例として、例5-8を参照してください。

リレーショナル表やビューに対して、XMLデータのときのように最初にSQL/XMLビューを作成する必要なく問合せを実行するには、XQuery関数fn:collectionをXQuery式内で使用し、URIスキーム名oradbを使用するURIを、データのデータベースの場所とともに引数として引き渡します。URIスキームoradb: XQueryを使用した表またはビュー・データの問合せを参照してください。

注意:

Oracle Database 11gリリース2より前のリリースでは、一部のユーザーは一部の処理の実行にOracle SQL関数extractおよびextractValueを使用していました。これらの処理は、SQL/XML関数XMLQueryおよびXMLCastを使用するとより効率的に実行できます。SQL関数extractおよびextractValueは、Oracle Database 11gリリース2で非推奨になりました。

関連項目:

Oracle DatabaseにおけるSQL/XML関数XMLQueryの参考情報は、Oracle Database SQL言語リファレンスを参照してください。

4.3.2 Oracle XML DBのXMLTABLE SQL/XML関数

SQL/XML関数XMLTableは、XQuery式の評価結果を新規の仮想表に対するリレーショナル行と列に分解します。このデータは、既存のデータベース表に挿入でき、またSQLを使用して(join式など)問合せできます。

例5-9を参照してください。

SQLのFROM句でXMLTableを使用します。

XML_namespaces_clause ::=

xml_namespaces_clause.epsの説明が続きます
図xml_namespaces_clause.epsの説明

注意: DEFAULT string句を1つのみ指定できます。

XMLTABLE_options ::=

XML_passing_clause ::=

XML_table_column ::=

  • XQuery_stringは、XMLTableコールの行パターンと呼ばれる場合があります。これは、リテラル文字列としての完全なXQuery式で、プロローグを含む場合があります。式の値は XMLTable関数への入力となります。つまり、このXQueryの結果が分解されリレーショナル・データとして格納されます。

  • オプションのXMLNAMESPACES句にはXML名前空間宣言が含まれており、XML_table_columnPATH句で、XQuery_stringおよびXPath式により参照されます。

  • XML_passing_clauseはキーワードPASSINGに1つ以上のSQL式(expr)を続けたもので、それぞれXMLTypeインスタンスまたはSQLスカラー・データ型の(つまり、オブジェクト・データ型でもコレクション・データ型でもない)インスタンスを戻します。それぞれの式(expr)は、適切にキャストされた表またはビューの列の値、PL/SQL変数、バインド変数のいずれかになります。1つを除いてすべての式では、その後にASおよびXQuery identifierが続いている必要があります。それぞれのexprの評価結果は、対応するidentifierにバインドされ、続いてXQuery_stringが評価されます。AS句に続いていないexprがあった場合、そのexprの評価結果は、XQuery_stringを評価する際のコンテキスト項目として使用されます。Oracle XML DBではBY VALUEを渡すことはできますが、BY REFERENCEは渡せないため、BY VALUE句は暗黙的で、省略可能です。

  • オプションのCOLUMNS句は、XMLTableにより作成される仮想表の列を定義します。

    • COLUMNS句を省略した場合、XMLTableは、COLUMN_VALUEという名前で単独のXMLType疑似列を戻します。

    • FOR ORDINALITYは、columnが生成される行数の列になることを示します(SQLデータ型NUMBER)。行番号は1から始まります。最大で1個のFOR ORDINALITY句がある必要があります。

    • FOR ORDINALITY列を除き、生成された各に列のデータ型を指定する必要があります。XMLTypeまたは任意のSQLデータ型(構文の説明でdatatypeと呼ばれる)を指定できます。

    • データ型XMLTypeの場合、仕様(SEQUENCE) BY REFも含める場合は、PATH式(string)でターゲットとなっているソース・データへの参照columnのコンテンツとして戻されます。それ以外の場合、columnにはそのターゲット・データのコピーが含まれます。

      参照によってXMLTypeデータを戻すことで、ソース・データにおいてcolumnPATH式でターゲットとなっているノード外のノードをターゲットにするその他の列を指定できます。例5-13を参照してください。

    • オプションのPATH句は、XQuery式stringにより扱われたXQueryの結果の一部がcolumnコンテンツの一部として使用されることを示しています。このXQuery式は、列パターンと呼ばれる場合があります。複数のPATH句を使用してXQueryの結果を異なる仮想表の列に分割できます。

      PATHを指定しない場合、XQuery式のcolumnとみなされます。たとえば、次の2つの式は等価です。

      XMLTable(... COLUMNS foo)
      XMLTable(... COLUMNS foo PATH 'FOO')
      

      XQuery式stringはパスXQuery_stringに対して相対的であるため、相対パスの表記にする必要があります。

    • オプションのDEFAULT句は、PATH式の結果が空のシーケンス(またはNULL)になる場合に使用する値を指定します。exprは、デフォルト値の生成用に評価するXQuery式です。

関連項目:

Oracle DatabaseにおけるSQL/XML関数XMLTableの参考情報は、Oracle Database SQL言語リファレンスを参照してください。

注意:

Oracle Database 11gリリース2より前のリリースでは、一部のユーザーは一部の処理の実行に、SQL TABLEコレクション式でOracle SQL関数XMLSequence(TABLE(XMLSequence(...)))を使用していましたが、これらの処理は、SQL/XML関数XMLTableを使用するとより効率的に実行できます。関数XMLSequenceは、Oracle Database 11gリリース2で非推奨になりました。

SQL TABLEコレクション式の詳細は、Oracle Database SQL言語リファレンスを参照してください。

4.3.2.1 SQL/XML関数XMLTABLEのコールのチェーン

XMLType表に複数レベルで含まれているデータをリレーショナル表(またはビュー)の個別の行として公開する必要がある場合は、単一レベルの分割と同じ一般的な方法を使用します。つまり、SQL/XML関数XMLTableを使用して、表を構成する列の定義および列へのXMLノードのマッピングを行います。

ただし、この場合は、分割してリレーショナル列に格納する各文書レベルに関数XMLTableを適用します。複数のXMLTableコールをチェーンするこの技術は、XMLType表内の文書とリレーショナル表内の行との間に、1対(1:N)関係がある場合はいつでも使用します。

1つのレベルのXMLTypeデータを、あるXMLTableコールから次のコールに渡し、その列タイプをXMLTypeで指定します。

2つのXMLTableコールをチェーンする場合、各コールの行パターンは、そのコールの列パターンで参照されるすべてのノードに対して共通の祖先である最深ノードを対象とします。

これについては例4-1に示しています。

XMLTypepo_binaryxmlの各PurchaseOrder要素にLineItems要素が含まれていて、この要素に1つ以上のLineItem要素が含まれているとします。各LineItem要素には、DescriptionItemNumber属性などの子要素があります。このような下位レベルのデータをリレーショナル値としてアクセス可能にするには、XMLTableを使用してLineItem要素のコレクションを投影します。

要素PurchaseOrderを、XMLTableの最初のコールで分割すると、その子孫であるLineItem要素は、XMLフラグメントが含まれている型XMLTypeの列にマップされます。この列は次に、XMLTableへの2回目のコールに渡され、リレーショナル値の複数の列として複数の部分に分割されます。

XMLTableの最初のコールでは、/PurchaseOrderを行パターンとして使用します。これは、PurchaseOrderが、列パターンReferenceおよびLineItems/LineItemの最深の共通祖先ノードであるためです。

XMLTableの2回目のコールでは、/LineItemを行パターンとして使用します。これは、そのノードが、各列パターン(@ItemNumberDescriptionPart/@Idなど)の最深の共通祖先ノードであるためです。

最初のXMLTableコールから2回目のコールに渡される列(po.lineitem)の列パターン(LineItems/LineItem)は、2回目のXMLTableコールが分解する繰返し要素(LineItem)で終わります。この繰返し要素は先行スラッシュ(/)で作成され、2回目のXMLTableコールの行パターンの最初の要素として使用されます。

このようにして、各ケースの行パターンは、絶対パスで表します。つまり/で開始します。これは、XMLTableによる分割の開始点になります。一方で、列パターンの先頭がスラッシュ(/)になることはありません。つまり、同じXMLTableコールの行パターンと常に相対的になります。

例4-1 XMLTableコールのチェーン

  SELECT po.reference, li.*
    FROM po_binaryxml p,
         XMLTable('/PurchaseOrder' PASSING p.OBJECT_VALUE
                  COLUMNS
                    reference VARCHAR2(30) PATH 'Reference',
                    lineitem  XMLType      PATH 'LineItems/LineItem') po,
         XMLTable('/LineItem' PASSING po.lineitem
                  COLUMNS
                    itemno      NUMBER(38)    PATH '@ItemNumber',
                    description VARCHAR2(256) PATH 'Description',
                    partno      VARCHAR2(14)  PATH 'Part/@Id',
                    quantity    NUMBER(12, 2) PATH 'Part/@Quantity',
                    unitprice   NUMBER(8, 4)  PATH 'Part/@UnitPrice') li;

4.3.3 Oracle XML DBのXMLEXISTS SQL/XML関数

SQL/XML標準関数XMLExistsは、指定されたXQuery式から空でないXQuery順序が戻されるかどうかをチェックします。その場合、関数はTRUEを戻します。それ以外の場合はFALSEを返します。

図4-3に、関数XMLExistsの構文を示します。

XML_passing_clause ::=

  • XQuery_stringは完結したXQuery式で、プロローグをリテラル文字列として含む場合があります。XQueryのPASSING句(構文図のXML_passing_clause)を使用してバインドするXQuery変数を含めることができます。SQL/XML関数XMLQueryに対し認識されている、事前定義された名前空間の接頭辞は、XQuery_stringでも認識されています。詳細は、事前定義済のXQuery名前空間と接頭辞を参照してください。

  • XML_passing_clauseはキーワードPASSINGに1つ以上のSQL式(expr)を続けたもので、それぞれXMLTypeインスタンスまたはSQLスカラー・データ型のインスタンスを戻します。1つを除いてすべての式では、その後にASおよびXQuery identifierが続いている必要があります。それぞれのexprの評価結果は、対応するidentifierにバインドされ、続いてXQuery_stringが評価されます。AS句に続いていないexprがあった場合、そのexprの評価結果は、XQuery_stringを評価する際のコンテキスト項目として使用されます。Oracle XML DBではBY VALUEを渡すことはできますが、BY REFERENCEは渡せないため、BY VALUE句は暗黙的で、省略可能です。

/PurchaseOrder/Referenceまたは/PurchaseOrder/Reference/text()などのXQuery式が、単一のノードをターゲットとする場合、XMLExistsはその式にtrueを戻します。どのノードも検索しないXQuery式を使用してXMLExistsをコールした場合、XMLExistsfalseを戻します。

関数XMLExistsは、問合せ内で使用できます。また、問合せの評価を高速化するためのファンクション索引を作成する場合にも使用できます。

注意:

Oracle XML DBは、XMLExistsの使用をSQLのWHERE句またはCASE式に制限します。XMLExistsSELECTリストの中で使用する必要がある場合は、次のようにそれをCASE式でラップします。

CASE WHEN XMLExists(...) THEN 'TRUE' ELSE 'FALSE' END

注意:

Oracle Database 11gリリース2以前では、一部のユーザーは一部の処理の実行にOracle SQL関数existsNodeを使用していました。これらの処理は、SQL/XML関数XMLExistsを使用してより効率的に実行できるようになっています。関数existsNodeは、Oracle Database 11gリリース2で非推奨になりました。2つの関数は、次の重要な点が異なります。

  • 関数existsNodeは、0または1を戻します。関数XMLExistsは、ブール値のTRUEまたはFALSEを戻します。

  • existsNodeは、問合せSELECTリストで使用できます。SELECTリストではXMLExistsを直接使用できませんが、SELECTリストのCASE式内ではXMLExistsを使用できます。

4.3.4 ノードを検索するためのXMLExistsの使用

SQL/XML標準関数XMLExistsを使用して、特定のノードを検索できます。XMLExistsを使用してファンクション索引を作成できます。また、XMLIndex索引を作成して、任意のXQuery検索を高速化することもできます。

例4-2では、XMLExistsを使用して、SpecialInstructionsExpediteに設定されている行を選択します。

例4-2 SQL/XML関数XMLExistsを使用したノードの検索

SELECT OBJECT_VALUE
  FROM purchaseorder
  WHERE XMLExists('/PurchaseOrder[SpecialInstructions="Expedite"]'
                  PASSING OBJECT_VALUE);
 
OBJECT_VALUE
--------------------------------------------------------------------
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
13 rows selected.

4.3.5 Oracle XML DBのXMLCAST SQL/XML関数

SQL/XML関数XMLCastを使用して、SQLデータ型にXQuery値をキャストできます。

図4-4に、SQL/XMLの標準関数XMLCastの構文を示します。

SQL/XML標準関数XMLCastは、その最初の引数を2番目の引数で指定されるSQLスカラー・データ型にキャストします。最初の引数は、評価されるSQL式です。次のSQLデータ型は第2引数として使用できます。

  • NUMBER

  • VARCHAR2

  • CHAR

  • CLOB

  • BLOB

  • REF XMLTYPE

  • 任意のSQL日時データ型

注意:

標準SQL/XMLとは異なり、Oracle XML DBではXMLをSQLスカラー・データ型にキャストするためのXMLCastの使用を制限しています。Oracle XML DBは、XMLからXMLへのキャストやスカラーSQL型からXMLへのキャストをサポートしていません。

最初のXMLCast引数の評価結果は、XML値になります。この値は、XQueryアトミック処理を使用して、XQueryアトミック値をターゲット・データ型にキャストすることにより、ターゲットSQLデータ型に変換されます。この変換に失敗すると、エラーが発生します。変換が成功すると、戻される結果は、ターゲット・データ型のインスタンスになります。

注意:

  • Oracle Database 11gリリース2以前では、一部のユーザーは一部の処理の実行にOracle SQL関数extractValueを使用していました。これらの処理は、SQL/XML関数XMLQueryおよびXMLCastを使用してより効率的に実行できるようになっています。関数extractValueは、Oracle Database 11gリリース2で非推奨になりました。

  • 関数extractValueでは、XPath式の引数が複数のテキスト・ノードに一致するとエラーが発生します。XMLQueryの結果にXMLCastを適用すると、テキスト・ノードが連結されて戻され、エラーは発生しません

4.3.6 XMLフラグメントのスカラー値を抽出するためのXMLCASTの使用

標準SQL/XML関数XMLCastを使用して、XMLフラグメントのスカラー値を抽出できます。

例4-3の問合せは、Referenceノードのスカラー値を抽出します。

例4-3 XMLCASTを使用したXMLフラグメントのスカラー値の抽出

SELECT XMLCast(XMLQuery('/PurchaseOrder/Reference' PASSING OBJECT_VALUE
                                                   RETURNING CONTENT)
               AS VARCHAR2(100)) "REFERENCE"
  FROM purchaseorder
  WHERE XMLExists('/PurchaseOrder[SpecialInstructions="Expedite"]'
                  PASSING OBJECT_VALUE);
 
REFERENCE
----------------------------
AMCEWEN-20021009123336271PDT
SKING-20021009123336321PDT
AWALSH-20021009123337303PDT
JCHEN-20021009123337123PDT
AWALSH-20021009123336642PDT
SKING-20021009123336622PDT
SKING-20021009123336822PDT
AWALSH-20021009123336101PDT
WSMITH-20021009123336412PDT
AWALSH-20021009123337954PDT
SKING-20021009123338294PDT
WSMITH-20021009123338154PDT
TFOX-20021009123337463PDT
 
13 rows selected.

4.4 URIスキームoradb: XQueryを使用した表またはビュー・データの問合せ

XQuery関数fn:collectionを使用して、データベースの表およびビュー内のデータを問い合せることができます。

XQuery関数fn:docfn:collectionを使用して、Oracle XML DBリポジトリのリソースに対して問い合せること(「XQueryを使用したOracle XML DBリポジトリ内でのXMLデータの問合せ」を参照)に加えて、fn:collectionを使用して、データベースの表およびビュー内のデータを問い合せることができます。

これを行うには、問い合せる表またはビューを指定する、関数fn:collectionのURI引数を渡します。Oracle URIスキーマoradbによりこの使用が識別されます。これがないと、引数はリポジトリの場所として扱われます。

問い合せる表またはビューは、リレーショナルまたはXMLType型のどちらでもかまいません。リレーショナルの場合は、データはその場で変換され、XMLとして扱われます。fn:collectionによって戻される結果は、常にXQueryシーケンスです。

  • XMLTypeの表については、fn:collectionによって戻される各XML文書のルート要素は、表のXML文書のルート要素と同じです。

  • リレーショナルの表の場合、fn:collectionによって戻される各XML文書のルート要素はROWです。ROW要素の子は、表の列と同じ名前(大文字)を持つ要素です。子要素の内容は、列のデータに一致します。列の型がXMLTypeの場合は内容はXML要素で、それ以外の場合(列はスカラー型)は内容はxs:string型です。

fn:collectionに引き渡されるURI要素の形式は、次のとおりです。

  • データベース・スキーマDB-SCHEMA内のXMLTypeまたはリレーショナルの表あるいはビューTABLEの場合

    oradb:/DB-SCHEMA/TABLE/
    

    TABLEがパブリック・シノニムか、TABLEが現在ログイン中のデータベース・ユーザーがアクセス可能な表またはビューの場合、DB-SCHEMAPUBLICを使用できます。

  • リレーショナルの表またはビュー内のXMLType列の場合

    oradb:/DB-SCHEMA/REL-TABLE/ROWPRED/X-COL
    

    REL-TABLEはリレーショナル表またはビューで、PREDXMLType列と関係しないXPath述語です。X-COLREL-TABLEXMLType列です。PREDはオプションで、DB-SCHEMAREL-TABLEおよびX-COLは必須です。

オプションのXPath述語PREDは、次の条件を満たす必要があります。

  • XMLType列が一切関係しない。

  • 一般的な同等の結合(and)と分離(or)および不等の比較(=!=><>=<=)のみが関係している。

  • それぞれの比較演算について、REL-TABLEの両側の名前(XML以外)列、またはある列と他方のような一方の名前が、表4-3で指定された正しい型の値である。他の型を使用すると、エラーが発生します。

表4-3 oradb式: 比較用の列の型

リレーショナルの列の型 XQuery値の型

VARCHAR2CHAR

xs:stringまたは文字列リテラル

NUMBERFLOATBINARY_FLOATBINARY_DOUBLE

xs:decimalxs:floatxs:double、または数値リテラル

DATETIMESTAMPTIMESTAMP WITH TIMEZONETIMESTAMP WITH LOCAL TIMEZONE

xs:datexs:timexs:dateTime

INTERVALYEARTOMONTH

xs:yearMonthDuration

INTERVALDAYTOSECOND

xs:dayTimeDuration

RAW

xs:hexBinary

ROWID

xs:stringまたは文字列リテラル

たとえば、このXQuery式は、表oe.warehousesXMLTypewarehouse_specにあって、列warehouse_idの値が6より小さい行のすべてのXML文書を表します。

fn:collection('oradb:/OE/WAREHOUSES/ROW[WAREHOUSE_ID < 6]/WAREHOUSE_SPEC')

4.5 Oracle XQuery拡張関数

Oracle XML DBには、W3C標準に用意されているものの他に、いくつかのXQuery関数が追加されています。それらの追加関数はOracle XML DB名前空間、http://xmlns.oracle.com/xdbにあります。この名前空間は事前定義の接頭辞oraを使用します。

注意:

Oracle XQuery関数ora:containsは、Oracle Database 12cリリース2 (12.2.0.1)では非推奨です。かわりにXQuery Full Textを使用してください。

4.5.1 ora:contains XQuery関数(非推奨)

Oracle XQueryおよびXPath関数ora:containsについて説明します。この関数は、Oracle Database 12cリリース2 (12.2.0.1)では非推奨です。かわりにXQuery Full Textを使用してください。

ora:contains構文

ora:contains (input_text, text_query [, policy_name] [, policy_owner])

非推奨のOracle XQueryおよびXPath関数ora:containsは、SQL/XML関数XMLQueryXMLTableまたはXMLExistsへのコールのXQuery式内で使用できます。これは、全文述語を伴う構成検索を制限する場合に使用されます。関数ora:containsinput_texttext_queryと一致した場合は正の整数を戻し(数字が大きいほど、一致の関連性は高くなります)、一致しない場合はゼロを戻します。XQuery式内部で使用される場合(XPath式のみでなく)、XQueryの戻り型はxs:integer()です。XQuery式外部のXPath式で使用される場合、XPathの戻り型はnumberです。

引数input_textは単一のテキスト・ノードまたは属性に対して評価される必要があります。ora:containsにおけるtext_queryの構文と意味論は、いくつかの制限を伴う他はcontainsにおけるtext_queryと同一です。

4.5.2 ora:sqrt XQuery関数

Oracle XQuery関数ora:sqrtは、数値引数の平方根を戻し、引数はXQuery型xs:decimalxs:float、またはxs:doubleのいずれかです。戻り値のXQuery型は引数と同じです。

ora:sqrt構文

ora:sqrt (number)

4.5.3 ora:tokenize XQuery関数

Oracle XQuery関数ora:tokenizeでは、正規表現を使用して入力文字列target_stringを文字列のシーケンスに分割できます。

ora:tokenize構文

ora:tokenize (target_string, match_pattern [, match_parameter])

関数ora:tokenizeでは、正規表現match_patternと一致する部分文字列はそれぞれ、分割位置を示すセパレータとして扱われます。トークンのシーケンスは、型xs:string*のXQuery値(xs:string値のシーケンス)として戻されます。target_stringが空のシーケンスの場合は、それが戻されます。オプションの引数match_parameterは、検索文字列を修飾するコードで、大文字/小文字の区別などを指定できます。

引数の型は次のとおりです。

  • target_string - xs:string?脚注3

  • match_pattern - xs:string

  • match_parameter - xs:string

4.6 Oracle XQuery拡張式プラグマ

W3CのXQuery仕様では、実装により定義された拡張式を実装で提供できます。XQuery拡張式は、カッコ({})で囲まれたXQuery式で、実装で定義されたプラグマが接頭辞になります。Oracle実装では、このような複数のプラグマを提供します。

ここに記載したプラグマ以外のプラグマは認識されません。その他のプラグマ、すなわち不正なプラグマ・コンテンツを持つプラグマ(例: (#ora:view_on_null something_else #))を使用すると、エラーが発生します。

ora:view_on_nullの例では、null_test表にVARCHAR2(10)型の列abがあり、列b(aではない)が空であるとします。

  • (#ora:child-element-name name #) - 挿入される子要素に使用する名前を指定します。一般に、このプラグマがないと、挿入される要素の名前はコンパイル時に不明とされます。名前を指定するとコンパイル時の最適化が可能で、実行時のパフォーマンスが向上します。

    たとえば、次のSQL文では、要素LineItemsの子として挿入される要素ノードの名前に、LineItemを指定します。挿入される要素データはXQuery変数p2の値で、バインド変数:1から取得します。

    UPDATE oe.purchaseorder p SET p.OBJECT_VALUE =
      XMLQuery(
        'copy $i :=
           $p1 modify (for $j in $i/PurchaseOrder/LineItems
                         return (#ora:child-element-name LineItem #)
                                {insert node $p2 into $j)
                      return $i'
        PASSING p.OBJECT_VALUE AS "p1", :1 AS "p2" RETURNING CONTENT)
      WHERE XMLQuery(
              '/PurchaseOrder/Reference/text()'
              PASSING p.OBJECT_VALUE RETURNING CONTENT).getStringVal() =
                'EMPTY_LINES';
    

    このプラグマは、オブジェクト・リレーショナル形式またはバイナリXMLとして格納されたXMLTypeデータに適用されます。

  • (#ora:defaultTable #): リポジトリ・データの格納に使用されるデフォルトの表を指定します。これを使用して、Query関数fn:docまたはfn:collectionを使用するリポジトリ問合せのパフォーマンスを向上させます。Oracle XQueryプラグマora:defaultTableの使用を参照してください。

  • (#ora:invalid_path empty #): 無効なXPath式のターゲットとなるノードがある場合、それが存在しないかのように処理します。例:

    SELECT XMLQuery('(#ora:invalid_path empty #)
                     {exists($p/PurchaseOrder//NotInTheSchema)}'
                    PASSING OBJECT_VALUE AS "p" RETURNING CONTENT)
      FROM oe.purchaseorder p;
    

    oe.purchaseorderのXML Schemaでは、NotInTheSchemaのようなノードは、PurchaseOrderノードの子孫とし使用できません。プラグマがない場合、このような無効なXPath式を使用するとエラーが発生します。しかし、プラグマを使用すると、コール元のコンテキストは、XPath式にターゲット・ノードがないかのように動作します。この例では、コール元のコンテキストはXQuery関数existsで、空のノード・シーケンスが渡されると、XQueryのブール値falseを戻します。(この例ではXQuery関数existsは動作を説明するためのみに使用されています。プラグマは関数existsに特に関連付けられていません)。

  • (#ora:view_on_null empty #): XQuery関数fn:collectionは、それぞれのNULL列に対して空のXML要素を戻します。たとえば、次の問合せでは、<ROW><A>x</A><B></B></ROW>が戻されます。

    SELECT XMLQuery('(#ora:view_on_null empty #)
                     {for $i in fn:collection("oradb:/PUBLIC/NULL_TEST")/ROW 
                      return $i}'
                    RETURNING CONTENT)
      FROM DUAL;
    
  • (#ora:view_on_null null #) – XQuery関数fn:collectionは、NULL列には要素を戻しません。たとえば、次の問合せでは、<ROW><A>x</A></ROW>が戻されます。

    SELECT XMLQuery('(#ora:view_on_null null #)
                     {for $i in fn:collection("oradb:/PUBLIC/NULL_TEST")/ROW 
                      return $i}'
                    RETURNING CONTENT)
      FROM DUAL;
    
  • (#ora:no_xmlquery_rewrite #)脚注 4: プラグマに続くXQuery式内のXQueryプロシージャのコールを最適化しません。かわりに機能上の評価を使用します。

    これは、SQLヒント/*+ NO_XML_QUERY_REWRITE */と同じ効果がありますが、プラグマの範囲は後に続くXQuery式のみです(SQL文全体ではありません)。

    関連項目:

    オプティマイザ・ヒントNO_XML_QUERY_REWRITEの詳細は、XMLIndexの使用の無効化を参照してください。

  • (#ora:xmlquery_rewrite #)脚注 4: プラグマに続くXQuery式の最適化を試みます。つまり、もし可能な場合は、機能面で評価しないでください。

    ora:no_xmlquery_rewriteora:xmlquery_rewriteの両方の使用例として、次の問合せでは、XMLQueryに対するXQuery式の引数は、一般的に機能面で評価されますが、プラグマora:xmlquery_rewriteの後に続くfn:collection部分式は可能なかぎり最適化されます。

    SELECT XMLQuery('(#ora:no_xmlquery_rewrite#) (: Do not optimize expression :)
                     {for $i in (#ora:xmlquery_rewrite#) (: Optimize subexp. :)
                                {fn:collection("oradb:/HR/REGIONS")},
                          $j in (#ora:xmlquery_rewrite#) (: Optimize subexpr. :)
                                {fn:collection("oradb:/HR/COUNTRIES")}
                      where $i/ROW/REGION_ID = $j/ROW/REGION_ID
                        and $i/ROW/REGION_NAME = $regionname
                      return $j}'
             PASSING CAST('&REGION' AS VARCHAR2(40)) AS "regionname"
               RETURNING CONTENT)
      AS asian_countries FROM DUAL;
    
  • (#ora:no_schema #) - XQuery Full Text式でXML Schemaに基づくXMLTypeデータを使用した場合に、エラーを発生させません。かわりに、XML Schemaに基づかないデータに対して暗黙的にデータをキャストします。つまり具体的には、XML Schemaデータ型を無視します。

    XQuery Full Textがサポートされるのは、バイナリXMLとして格納されているXMLTypeデータのみなので、このプラグマが適用されるのも同じ場合のみです。

  • (#ora:use_xmltext_idx #) - XML検索索引(使用可能な場合)を使用して問合せを評価します。XMLIndex索引またはストリーミング評価は使用しません。

    XML検索索引は、バイナリXMLとして格納されているXMLTypeデータにのみ適用され、このプラグマも同様です。

  • (#ora:transform_keep_schema #) - プラグマに従うXQuery式によって返される文書のXML Schema情報を維持します。これは、コピー・セマンティクスを使用するXQuery Updateで役立ちます。

    プラグマを使用しない場合、XML Schemaに基づくデータがXQuery Update操作中にコピーされるとき、XML Schema情報が失われます。これは、XQuery Update標準で指定される動作です。その後、更新されたデータをXML Schemaベースの列または表に挿入しようとすると、エラーが発生し、挿入しようとしたデータは型指定がなくなるため、XML Schemaに準拠しなくなります。

    プラグマを使用する場合、データはXML Schema情報を維持するため、挿入エラーが発生しません。ここでは、プラグマを使用する例を示します。

    SELECT XMLQuery('declare default element namespace
                     "http://xmlns.oracle.com/xdb/xdbconfig.xsd"; (: :)
                     (#ora:transform_keep_schema#)
                     {copy $NEWXML :=
                       $XML modify (for $CFG in $NEWXML/xdbconfig//httpconfig 
                                      return (replace value of node
                                              $CFG/http-port with xs:int($PORTNO)))
                                   return $NEWXML}'
                    PASSING CFG AS "XML", 81 as "PORTNO" RETURNING CONTENT)
      FROM DUAL;

4.7 Oracle XML DBにおけるXQuery静的型チェック

可能な場合は、Oracle XML DBによって、問合せの静的(コンパイル時)型チェックが実行されます。

Oracle XML DBはすべてのXQuery式を型チェックします。しかし、実行時の型チェックはコストがかかることがあります。最適化技法として、指定された問合せに対してコンパイル時に十分な静的型情報を利用できる場合は常に、Oracle XML DBはその問合せの静的な(コンパイル時)型チェックを行います。指定された問合せに対してコンパイル時に十分な静的型情報を利用できない場合は、Oracle XML DBはその問合せの動的(実行時)型チェックを使用します。

静的型チェックでは、コンパイル時にエラーが発生するので、実行時間を節約できることがあります。静的型チェック・エラーには、データ型エラーと、XML Schemaの観点から無効であるXPath式の使用の両方を含みます。

コンパイル時に十分な静的型情報を提供する一般的な方法には、次の方法があります。

  • リレーショナル・データに関してXQueryとfn:docまたはfn:collectionを使用。

  • XQueryを使用して、問合せコンパイル時にXML Schema情報を利用できるXMLType表、列またはビューを問い合せます。

  • XML Schemaに基づくXMLType表または列から入力データを取得する変換式で、XQuery Updateを使用。

この項では、静的型チェックの有効性と、型情報を通信するこれら2つの手段の使用方法を示す例を紹介します。

fn:collectionおよびURIスキームoradbによってその場で生成されるXMLデータは、ROWを最上位の要素に持ちますが、例4-4の問合せには、ROWのラッパー要素が欠けています。この脱落により、問合せのコンパイル時エラーが発生します。このようにfn:collectionoradbによりリレーショナル・データをラップし忘れる誤りはよくあることですが、静的型チェックがないと、診断が困難な場合があります。例5-5に正しいコードを示します。

例4-5では、XQueryの静的型チェックにより、XPath式とそのターゲットXML Schemaに基づくデータの不一致を検出します。要素CostCenterが、ここではcostcenterと誤ったスペルになっています(XQueryおよびXPathは大文字/小文字を区別します)。例5-11に正しいコードを示します。

例4-4 XQuery式の静的型チェック: oradb URIスキーム

-- This produces a static-type-check error, because "ROW" is missing.
SELECT XMLQuery('for $i in fn:collection("oradb:/HR/REGIONS"),
                     $j in fn:collection("oradb:/HR/COUNTRIES")
                 where $i/REGION_ID = $j/REGION_ID and $i/REGION_NAME = "Asia"
                 return $j'
                RETURNING CONTENT) AS asian_countries
  FROM DUAL;
SELECT XMLQuery('for $i in fn:collection("oradb:/HR/REGIONS"),
*
ERROR at line 1:
ORA-19276: XPST0005 - XPath step specifies an invalid element/attribute name:
(REGION_ID)

例4-5 XQuery式の静的型チェック: XML Schemaベースのデータ

-- This results in a static-type-check error: CostCenter is not the right case.
SELECT xtab.poref, xtab.usr, xtab.requestor
  FROM purchaseorder,
       XMLTable('for $i in /PurchaseOrder where $i/costcenter eq "A10" return $i'
                PASSING OBJECT_VALUE
                COLUMNS poref     VARCHAR2(20) PATH 'Reference',
                        usr       VARCHAR2(20) PATH 'User' DEFAULT 'Unknown',
                        requestor VARCHAR2(20) PATH 'Requestor') xtab;
  FROM purchaseorder,
       *
ERROR at line 2:
ORA-19276: XPST0005 - XPath step specifies an invalid element/attribute name:
(costcenter)

4.8 Oracle XML DBでのXQueryサポート

Oracle XML DBのXQuery言語サポートには、SQLサポートとXQueryの関数と演算子のサポートが含まれます。

4.8.1 XQueryとSQLのサポート

Oracle XML DBのXQuery言語サポートは、リレーショナル記憶域の使用範囲とXMLデータの問合せの使用範囲のベスト・フィットの実現を目指しています。Oracle XML DBは一般的なXQuery実装ですが、それと同時に、リレーショナル問合せとXML問合せの連携動作に特に注意して設計されています。

この項では、Oracle XML DBのXQuery実装の個別のプロパティについて説明します。XQuery標準は、言語処理の一部の特性について、実装により定義されるのか、実装に依存するのかを明示的にコール・アウトしています。また、XQuery標準で規定されているが、Oracle XML DBでサポートされていない機能もいくつかあります。

関連トピック

4.8.1.1 XQuery標準で指定された実装の選択肢

XQuery標準では、実装により定義される言語処理のいくつかの点が指定されています。

  • 暗黙的タイムゾーン・サポート: Oracle XML DBでは、暗黙的タイムゾーンを常にZと仮定しています。タイムゾーンのないxs:datexs:timeおよびxs:datetimeのインスタンスは、自動的にUTCに変換されます。

  • copy-namespacesのデフォルト値: copy-namespaces宣言のデフォルト値(XQuery Updateで使用)はinheritです。

  • 再検証モード: XQuery Update変換式の再検証のデフォルト・モードはskipです。ただし、変換式の結果が、XMLType表または列内のXML Schemaに基づくデータに対する更新である場合は、XML Schemaの検証が適用されます。

4.8.1.2 Oracle XML DBでサポートされていないXQuery機能

Oracle XML DBではサポートされていない、XQuery標準で規定されている機能を示します。

  • copy-namespacesモード: Oracle XML DBでcopy-namespaces宣言についてサポートされるのは、preserveinheritのみです。既存の要素ノードが要素コンストラクタまたは文書コンストラクタによりコピーされた場合、元の要素の範囲にあるすべてのネームスペースはコピー内に保持されます。そうでない場合は、コピーされたノードは構築されたノードの範囲内にあるすべてのネームスペースを継承します。no-preserveまたはno-inheritを指定するとエラーが発生します。

  • バージョン・エンコーディング: Oracle XML DBでは、バージョン宣言の中のオプションのエンコーディング宣言はサポートされません。つまり、(encoding an-encoding)を宣言xquery version a-version;の中に含むことはできません。特に、問合せで使用するエンコーディングは指定できません。エンコーディング宣言が含まれるとエラーが発生します。

  • xml:id: Oracle XML DBでは、xml:idの使用はサポートされません。xml:idを使用するとエラーが発生します。

  • XQueryプロローグのデフォルト照合宣言

  • XQueryプロローグの境界空間宣言

  • XQueryデータ型xs:duration。かわりにxs:yearMonthDurationまたはxs:DayTimeDurationを使用します。

  • XQuery Update関数fn:put

4.8.1.3 XQueryのオプション機能

Oracle XML DBでサポートされていないオプションのXQuery機能が指定されます。

XQuery標準では、いくつかの機能が特定の実装でオプションであることが指定されています。次に示すオプションのXQuery機能は、Oracle XML DBではサポートされていません

  • スキーマ検証機能

  • モジュール機能

次に示すオプションのXQuery機能は、Oracle XML DBでサポートされています。

  • XQuery静的型指定機能

  • XQuery Update静的型指定機能

4.8.2 XQueryの関数と演算子のサポート

Oracle XML DBでは、いくつかの例外はありますが、最新のXQuery 1.0およびXPath 2.0の関数と演算子の仕様に含まれるほとんどのXQuery関数とXQuery演算子がサポートされています。

Oracle XML DBでは、次に示すXQuery関数とXQuery演算子はサポートされていません

  • 関数fn:tokenize。かわりにOracle XQuery関数ora:tokenizeを使用してください。

  • 関数fn:idおよびfn:idref

  • 引数のない関数fn:collection

  • XQuery関数のオプションの照合パラメータ。

4.8.2.1 XQuery関数fn:doc、fn:collectionおよびfn:doc-available

Oracle XML DBでは、Oracle XML DBリポジトリにあるすべてのリソースについて、XQuery関数fn:docfn:collectionおよびfn:doc-availableがサポートされています。

関数fn:docはURI引数によりターゲットとされているリポジトリのファイル・リソースを戻します。このリソースは整形式のXMLデータのファイルにしてください。関数fn:collectionも同様ですが、リポジトリのフォルダ・リソースに対して機能します(フォルダ内の各ファイルには整形式のXMLデータが含まれている必要があります)。

Oracle URIスキームoradbとともに使用すると、fn:collectionは既存のリレーショナル・データからその場で派生した、リポジトリにないXMLデータを戻すことができます。

XQuery関数fn:collectionは、URIスキームoradbとともに使用した場合、ターゲットの表やビュー、列が存在しないと、エラーが発生します。関数fn:docfn:collectionでは、引数として引き渡されたリポジトリのリソースが見つからない場合、エラーは発生しません。かわりに、空のシーケンスが戻されます。

任意の文書が存在するかどうかは、XQuery関数fn:doc-availableを使用して判断できます。文書の引数が存在する場合はtrue、存在しなければfalseがそれぞれ戻されます。

4.8.3 XQuery Full Textのサポート

Oracle XML DBでは、バイナリXMLとして格納されているXMLTypeデータに対してXQuery Full Textがサポートされます。Oracle Textテクノロジでは、このサポートの基準となる全文索引と検索が提供されます。

ここで説明されていない用語の詳細は、XQuery and XPath Full Text 1.0勧告(以後、XQuery Full TextまたはXQFTと表記)を参照してください。

XQuery Full Textがサポートされるのは、バイナリXMLとして格納されているXMLTypeデータに対してのみです。オブジェクト・リレーショナル形式として格納されているXMLTypeデータの全文検索は、XQuery Full TextではなくOracle Text索引を使用して実行できます。

OracleのXQuery Full Textサポートについて、OracleでのXQFTの実装はOracle Textを基礎とし、それによりOracle製品とそれを使用して開発されたアプリケーションに全文索引と検索機能を提供するものと一般的に理解されています。この項で説明しているXQFTサポートの詳細は、このOracle Textに基づいた実装から導かれたものです。

4.8.3.1 XQuery Full Text、XML Schemaに基づくデータ、およびプラグマora:no_schema

バイナリXMLとして格納されているXML Schemaに基づくXMLTypeデータの問合せには、Oracleプラグマora:no_schemaとXQuery Full Textを使用します。データは、XML Schemaに基づかないデータのように扱われます。

バイナリXMLとして格納されているXMLTypeデータの問合せには、XQuery Full Textを使用できます。ただし、XML Schemaに基づくデータでそれを使用する場合、問合せではXQuery拡張式プラグマora:no_schemaも使用する必要があり、そうしないとエラーが発生します。

また、XQuery Full Textのためにora:no_schemaを使用すると、XMLデータはXML Schemaに基づかないデータに暗黙的にキャストされます。つまり、OracleのXQuery Full Textサポートでは、すべてのXMLデータをXML Schemaに基づかないデータのように扱います。

つまり具体的には、XML Schemaデータ型を使用するXQuery Full Text条件を問合せに含めた場合、その型に関する考慮事項は無視されます。たとえば、2つのXML Schemaデータの値を比較する場合、単純な文字列の比較として扱われます。OracleのXQuery Full Textサポートでは、XML Schemaを認識しません。

4.8.3.2 XMLExistsでのXQuery Full Textの使用制限

SQL/XML関数XMLExistsとともにXQuery Full Textを使用する場合、制限が指定されています。

SQL/XML関数XMLExistsPASSING句にSQL式として渡すことのできるXMLTypeインスタンスは1つのみで、同じ句内に含まれるその他の非XMLType SQL式はすべて、組込みSQLデータ型のコンパイル時定数、またはこのようなデータ型のインスタンスにバインドされているバインド変数のいずれかである必要があります。この制限を順守しないと、コンパイル時エラーORA-18177が発生します。

4.8.3.3 サポートされているXQuery Full TextのFTSelection演算子

Oracle XML DBでは、XQuery Full TextのFTSelection演算子のサブセットがサポートされています。

Oracle XML DBでは、次に示すXQuery Full TextのFTSelection演算子のみをサポートしています。適用される制限がある場合は注記します。「する必要があります」、「しないでください」という言葉が使用されている場合、指定された制限を順守しないとエラーが発生します。ここにリストされていない演算子を使用すると、エラーが発生します。

  • FTAnd (ftand)

  • FTMildNot (not in)

    演算子FTMildNotの各オペランドは、語または句、つまりFTWordsのインスタンスにする必要があります。式にはしないでください。Oracleでは、Oracle Text演算子MNOTと同じようにFTMildNotを扱います。

  • FTOr (ftor)

  • FTOrder (ordered)

    Oracleでは、ウィンドウのコンテキスト(FTWindow)で使用されている場合にのみFTOrderの使用をサポートします。それ以外の場合はサポートされません。たとえば、ordered window 5 wordsは使用可能ですが、windowを付けずにorderedを単独では使用できません。Oracleでは、ORDERオプションに値TRUEが設定されているOracle Text演算子NEARと同じようにFTOrderを扱います。

  • FTUnaryNot (ftnot)

    FTUnaryNotはFTAndとともに使用する必要があります。FTUnaryNotを単独では使用できません。たとえば、ftand ftnotは使用可能ですが、ftandを付けずにftnotを単独では使用できません。Oracleでは、Oracle Text演算子NOTと同じようにFTUnaryNotを扱います。

  • FTWindow (window)

    Oracleでは、Oracle Text演算子NEARと同じようにFTWindowを扱います。ウィンドウ・サイズは、文や句(window 2 paragraphsなど)ではなく単語でのみ指定し、100以下の定数として指定する必要があります。

  • FTWords

    FTWordsValueはXQueryリテラル文字列またはSQLバインド変数にする必要があり、その値は、評価によってXMLType以外の値が戻されるSQL式から、SQL関数XMLExistsまたはXMLQueryに渡されます。

    また、FTAnyallOption (存在する場合)はanyにする必要があります。つまり、FTWordsは項目が1つのみのシーケンスに対応する必要があります。

    注意:

    FTWordsは項目が1つのみのシーケンスに対応していても、句全体を単一の文字列で表すことで、複数の語からなる句を引き続き検索できます。そのため、たとえばOracle XML DBではFTWordsに{"found" "necklace"}は使用できませんが、"found necklace"は使用できます。

4.8.3.4 サポートされているXQuery Full TextのMatchオプション

Oracle XML DBでは、XQuery Full Textのmatchオプションのサブセットがサポートされています。

Oracle XML DBでは、次に示すXQuery Full Textのmatchオプションのみをサポートしています。適用される制限がある場合は注記します。「する必要があります」、「しないでください」という言葉が使用されている場合、指定された制限を順守しないとエラーが発生します。ここにリストされていないmatchオプションを使用すると、エラーが発生します。

  • FTStemOption (stemmingno stemming)

次の例外を除いて、XQueryおよびXPath Full Text 1.0勧告で指定されているデフォルト動作が、サポートされていない各matchオプションに使用されています。

  • FTLanguage (サポート対象外) - 使用されている言語は、デフォルト・レクサーで定義された言語、すなわちデータベースのインストール時に使用された言語です。

  • FTStopWordOption (サポート対象外) - 使用されているストップリストは、その言語に定義されたストップリストです。

関連項目:

4.8.3.5 サポート対象外のXQuery Full Text機能

Oracle XML DBではサポートされていないXQuery Full Text機能を示します。

サポートされているXQuery Full TextのFTSelection演算子に記載されていないすべてのFTSelection演算子と、サポートされているXQuery Full TextのMatchオプションに記載されていないすべてのmatchオプションの他に、次のXQuery Full Text機能もOracle XML DBではサポートされていません

  • FTIgnoreOption

  • FTWeight (重みの宣言、FTPrimaryWithOptionsで使用)

  • FTScoreVar (スコア変数、XQuery ForClauseおよびLetClauseまたはXPath 2.0 SimpleForClauseで使用)

4.8.3.6 XQuery Full Textのエラー

XQuery Full Textの使用時に発生することがあるコンパイル時エラーについて説明します。

OracleでサポートされていないXQuery Full Text (XQFT)機能を使用すると必ずコンパイル時エラーが発生します。

また、対応するXML検索索引が作成されていないか、またはその索引が取得されていない場合、サポートされているXQFT式をSQL WHERE句(通常はXMLExists)内で使用すると必ずコンパイル時エラーORA-18177が発生します。

関連項目:



脚注の説明

脚注1:

戻り値は、通常と同様、シーケンスです。ただしXQueryでは、項目が1つのシーケンスはその項目自身と等価です。この場合、その単独の項目はブール値です。


脚注2:

名前空間の接頭辞xsは、XML Schemaの名前空間http://www.w3.org/2001/XMLSchemaであらかじめ定義されています。


脚注3:

ここでは、疑問符(?)は0回または1回出現することを示すインジケータで、引数が空のシーケンスである場合もあります。XQuery式を参照してください。


脚注4:

Oracle Database 12cリリース1 (12.1.0.1)より前は、プラグマora:no_xmlquery_rewriteおよびora:xmlquery_rewriteはそれぞれora:xq_procおよびora:xq_qryという名前でした。読みやすさのために名前が変更されていますが、内容には変更ありません。