4 XQueryとOracle XML DB
XQuery言語は、Oracle XML DBのXMLデータと対話する主な方法の1つです。この言語でのサポートには、SQL*PlusコマンドXQUERY
およびSQL/XML関数XMLQuery
、XMLTable
、XMLExists
およびXMLCast
があります。
XQuery言語の概要
XQueryはXMLデータの問合せおよび更新のために設計されたW3C言語です。
Oracle XML DBでは、次のW3C XQuery標準をサポートしています。
この項では、XQuery言語の概要を示します。詳細は、この言語に関する最新の書籍や、それを定義している標準に関する文書(すべてhttp://www.w3c.org/
から入手可能)を参照してください。
XQuery式に含まれるXPath式
XPath言語はXML文書をナビゲートするためのW3C勧告です。そしてXQuery言語のサブセットです。つまり、XPath式もXQuery式です。
XPathはXML文書をノードのツリーとしてモデル化します。このツリーを移動し、述語およびノード・テスト機能を適用するための一連の操作が備わっています。XPath式をXML文書に適用すると、ノードのセットが戻されます。たとえば、式/PO/PONO
は、文書のPO
ルート要素の下にあるすべてのPONO
子要素を選択します。
表4-1に、XPathで使用する共通構造体を示します。
表4-1 XPathの共通構造体
XPath構造体 | 説明 |
---|---|
|
XPath式のツリーのルートを示します。たとえば、 |
|
指定された要素ノードの子要素ノードを識別するためのパス区切りとして使用します。たとえば、 |
|
現行ノードのすべての子孫を識別するために使用します。たとえば、 |
|
任意の子ノードと一致させるためのワイルド・カードとして使用します。たとえば、 |
|
述語式を示すために使用します。XPathは 大カッコは、位置(索引)を示す場合にも使用します。たとえば、 |
関数 |
XPathおよびXQueryは、 |
XPath式は単一のノードまたは一連の要素、テキストまたは属性ノードを識別する必要があります。XPath式の評価結果はブール式にはできません。
XMLType
データは、PL/SQL、CまたはJavaを使用して選択できます。XMLType
メソッドgetNumberVal()
を使用して、XMLデータをNUMBER
値として取得することもできます。
ノート:
Oracle SQL関数およびXMLType
メソッドは、W3C XPath勧告に準拠しています。このことは、XPath式がどのノードもターゲットにしていない場合にXMLデータに適用されると、空のシーケンスが戻される必要があることを示します。この場合にエラーが発生してはいけません。
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インスタンスとも呼ばれます。
XQueryとシーケンス
XQueryは常にシーケンスの操作に関わります。このためXQueryは集合操作言語に類似しています。ただしシーケンスは順序付けされていて、重複項目を含むことができる点が異なります。XQueryシーケンスが他の言語のシーケンスと異なる点は、ネストされたXQueryシーケンスは実際の効果において常にフラット化されるという点です。
多くの場合、シーケンスを順序のないものとして処理することにより最適化を促進できます。ただしそれは可能な場合に限られ、ユーザーの責任となります。この順序なしモードは、ネストされた反復(for
)の処理で順序を結合する場合や、XPath式を処理する場合に適用できます(たとえば/a/b
では、一致するb
要素は文書順序に関係なく処理できます)。
XQueryシーケンスはゼロ個以上の項目から構成されています。項目は、アトム型(スカラー)の値またはXMLノードです。項目は、XML Schemaの型に基づくリッチ型体系を使用して型指定されます。この型体系は、ブール、数値、および文字列といった単純なスカラー型に制限されていたXPath 1.0から大きく変更された部分です。
参照が透過的な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など宣言型言語における変数は、実際には静的な値の名前です。
データに対するXQuery Updateの副次的な影響
参照の透過性は、XQuery式の評価に適用されます。ただし、この評価によってユーザーのデータに副次的な影響がまったく生じないわけではありません。特に、XQuery Updateを使用してデータを変更する場合です。その変更内容は、XQueryの更新式を評価した結果の副次的な影響です。
ただし、副次的な影響と式の値とは異なります。評価から戻される値には更新の保留中リストが含まれ、それには実行する更新が記載されています。所定のXQuery式では、評価のコンテキストに関係なく(前述の例外はありますが)、この記載内容は同じです。
XQuery Update標準では、データのXDMインスタンスの更新方法を定義します。これらの更新内容が永続的なデータ・ストア(XMLType
表および列など)に伝播される方法は実装に依存します。
XQuery Updateのスナップショット
XQuery式(問合せ)では、複数の更新操作をコールできます。XQuery Updateでは、同じ問合せでのこのような操作はすべてアトミック操作として実行され、すべて成功するか、またはすべて失敗するか(エラーが発生した場合)のいずれかになります。
つまり、変更の単位はXQuery問合せ全体です。このアトミックな更新動作を実現するため、XQuery Updateでは、問合せを評価する前に、問合せによってコールされる変更対象のデータ(XDMインスタンス)のスナップショットを取得します。問合せによってコールされる更新操作を更新の保留中リストに追加します。スナップショットは、更新ターゲットであるXDMインスタンスの評価コンテキストです。
XQuery式を評価する最後のステップとして、更新の保留中リストが処理され、指示された更新操作をアトミックに適用して、スナップショットを終了します。
スナップショット・セマンティクスのアトミック性は、指定された問合せで使用されている一連の更新操作が記載順に適用されるとはかぎらないことを意味します。実際には、更新操作の適用順序は、XQuery Update機能の標準によって固定および指定されます。
つまり、更新操作では同じ問合せにおける他の更新操作の結果を確認しません。中間的または暫定的な更新の状態という概念はなく、問合せの更新操作はすべてまとめてアトミックに適用されます。
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言語に追加します。このような式を問合せで使用して、要素ノードとその子孫要素のテキストを検索します(属性ノードのテキストも検索可能)。
関連項目:
大/小文字を区別した検索の詳細は、「大/小文字を区別した索引付けおよび問合せ」を参照してください。XQuery式
XQuery式では大/小文字が区別されます。XQuery式は、単純式または更新式のいずれかで、後者の式はデータの変更を表します。正確には、実行可能なXQuery式は次のとおりです。
-
基本更新式–
insert
、delete
、replace
またはrename
の各式、あるいは更新関数のコール(XQuery Update Facility 1.0勧告を参照)。 -
更新式–基本更新式、または別の更新式を含んでいる(変換式以外の)式(これは再帰的定義です)。
-
単純式–XQuery 1.0式。更新処理はコールしません。
単純式の評価結果として戻される更新の保留中リストは空です。更新式の評価結果として戻されるシーケンス値は空です。
単純式は次のとおりです。
-
1次式–リテラル、変数または関数アプリケーション。変数名は、たとえば
$foo
のように、ドル記号($
)で始まります。リテラルには、数値、数値、文字、または実体参照。 -
XPath式 – 任意のXPath式。XPath 2.0標準はXQueryのサブセットになります。
-
FLWOR式: 最も重要なXQuery式で、次の要素を順番に並べたもので構成されています。FLWORという名もそれに由来しています。
for
、let
、where
、order by
、return
。 -
XQueryシーケンス – カンマ(
,
)コンストラクタはシーケンスを作成します。union
やintersect
といったシーケンス操作関数も使用できます。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式が各部分式(
something
、somethingElse
、expression1
、および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:integer
、xs:string
。脚注 2型表現は、次のような出現インジケータを持てます。
?
(オプション。0回または1回)、*
(0回以上)、+
(1回以上)。たとえば、document-node(element())*
、item()+
、attribute()?
。XQueryには、型と組み合せて使用する演算子もあります。
cast as
、castable as
、treat as
、instance
の、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のサポートを参照してください。
-
FLWOR式
XQuery一般について考えた場合、特にFLWOR式には多くの学習事項があります。この項では、概要を簡単に紹介します。
FLWORはXQueryで最も一般的な式構文です。FLWOR(「フラワー」と読みます)は、for
、let
、where
、order by
、およびreturn
を表しています。FLWOR式には1つ以上のfor
またはlet
句と、1つのreturn
句を持ちます。1つのwhere
およびorder by
句がオプションです。更新式を含むことができるのはreturn
句のみで、それ以外の句はできません。
-
for
– 1つ以上の変数を任意の値に順にバインドします。つまり、各変数に対し反復を行いますが、変数を各回の反復で別の値にバインドします。各回の反復で、変数は出現する順にバインドされ、
for
リストで$later
の前にリストされた変数$earlier
の値が、変数$later
のバインドで使用されます。たとえば、次の式は、2回目の反復で$i
を4
にバインドし、$j
を6
(2+4)にバインドします。for $i in (3, 4), $j in ($i, 2+$i)
-
let
– 1つ以上の変数をバインドします。for
と同様、let
でも、let
のバインディング・リストで先にリストされている別の変数を使用して(またはfor
やlet
で囲むことにより)、変数を計算した値にバインドできます。たとえば、次の式は$j
を5
(3+2)にバインドします。let $i := 3, $j := $i + 2
-
where
–for
およびlet
の変数バインディングを特定の条件に応じてフィルタします。SQLのWHERE
句に類似しています。 -
order by
–where
フィルタリングの結果をソートします。 -
return
– 順序付けとフィルタリングがされた値を構成します。これがFLWOR式の最終的な結果です。フラット化されたシーケンスになります。return
句に更新式が含まれている場合は、別の句によって生成されたタプルごとに式が評価されます。これらの評価から取得した更新の保留中リストは、FLWOR式の結果としてマージされます。
式for
とlet
は、SQLのFROM
句に対して同じように機能します。式where
は、SQLのWHERE
句と同じように機能し、式order by
はSQLのORDER BY
と似ています。式return
は、SQLのSELECT
に似ています。両方の言語で名前が共通している2つのキーワード(where
、order by
)を除いて、FLWOR句の順序はSQL句の順序と反対ですが、対応する句の意味は非常に類似しています。
FLWOR式(order by
を含む)の使用は、文書の順序と異なる順序でXQueryシーケンスを構成する唯一の方法です。
Oracle XML DBにおけるXQueryの概要
Oracle XML DBのXQuery言語サポートは、SQL/XML関数XMLQuery
、XMLTable
、XMLExists
およびXMLCast
のネイティブ実装により提供されています。便宜性の観点から、SQL*PlusのコマンドXQUERY
も用意されており、XQuery式を直接入力することができます。実質的に、このコマンドにより、SQL*PlusはXQueryコマンドライン・インタプリタになります。
Oracle XML DBは、SQL/XML関数XMLQuery
、XMLTable
、XMLExists
およびXMLCast
に引数として渡されるXQuery式をコンパイルします。このコンパイルにより、SQL問合せブロックと、SQL/XML関数とXPath関数を使用する演算子ツリーが作成されます。XMLQuery
、XMLTable
、XMLExists
またはXMLCast
を含むSQL文は一括してコンパイルおよび最適化され、リレーショナル・データベースとXQuery特有の最適化テクノロジの両方を活用します。使用するXML記憶域と索引付けメソッドにより、XPath関数をさらに最適化することができます。結果として生じる最適化された演算子ツリーは、ストリーム方式で実行されます。
ノート:
Oracle XML Developer's Kit (XDK)では、中間層のXQueryをサポートしています。XQueryを使用するためにOracle Databaseにアクセスする必要はありません。XDKによって、XQuery API for Java (XQJ)を使用したXQuery式の評価が可能になります。
関連項目:
-
XQuery API for Java (XQJ) 1.0仕様書(2009年3月)
この仕様には、わかりやすい例が含まれており、非常に具体的で役に立ちます。
-
XQuery言語を拡張するOracle固有のXQuery関数については「Oracle XQuery拡張関数」
-
Oracle XML DBのXQueryサポートの詳細は、「Oracle XML DBのXQueryサポート」
-
XQJの使用方法の詳細は、Oracle XML Developer's Kitプログラマーズ・ガイドを参照してください。
XQueryの用途
SQL/XML生成関数またはXSLTを使用して実行される処理には、XQueryを使用して実行できるものが多く、両者の用途は多くの点で一致しています。あるタスクを実行する際にどのツールを使用するかは、様々な考慮事項に基づいて決定されるものであり、その考慮事項の多くはOracle Database以外に関連するものです。このような一般的な問題については、外部のドキュメントを参照してください。
一般的には、XMLデータに主眼を置いている場合はXQueryが使用され、リレーショナル・データに主眼を置いている場合はSQL/XML生成関数(XMLElement
、XMLAgg
など)が使用されます。
他の条件が同じであれば、既存のXML文書から抽出されたフラグメントに基づいて問合せによってXML文書を構成する場合は通常、リレーショナル・データからスカラー値を抽出し、SQL/XML生成関数を使用して目的のXMLデータを構成するよりも、通常はXQueryのFLOWR式が単純になります(そのためコードのメンテナンスも簡単になります)。一方、既存のリレーショナル・データに基づいて問合せによってXML文書を構成する場合は、通常、SQL/XML生成関数を使用する方が適しています。
Oracle XML DBに関しては、SQL/XML生成関数を使用しても、XMLQuery
およびXMLTable
を使用しても、期待できるパフォーマンスは、同じ一般的なレベルです。これは、いずれも最適化のリライト対象になります。
事前定義済のXQuery名前空間と接頭辞
いくつかの名前空間と接頭辞は、Oracle XML DBにおけるXQueryで使用するために事前定義されています。
表4-2 事前定義の名前空間と接頭辞
接頭辞 | 名前空間 | 説明 |
---|---|---|
|
|
Oracle XML DB名前空間 |
|
|
XPathのローカル関数宣言名前空間 |
|
|
XPath関数の名前空間 |
|
|
XML名前空間 |
|
|
XML Schema名前空間 |
|
|
XML Schemaインスタンス名前空間 |
これらの接頭辞は、あらかじめXQuery式プロローグで宣言しなくてもXQuery式で使用できます。また、xml以外
は、すべてプロローグ内で再定義できます。ora
以外の接頭辞はすべて、XQuery標準で事前定義されています。
SQL/XML関数XMLQUERY、XMLTABLE、XMLExistsおよびXMLCast
SQL/XML関数XMLQuery
、XMLTable
、XMLExists
、XMLCast
は、SQL/XML標準により、SQL言語とXQuery言語の一般インタフェースとして定義されています。
このマニュアルでは、それらはSQL/XMLの問合せおよび更新関数と呼ばれています。他のSQL/XML関数と同様、これらの関数を使用すると、SQLとXML、両方の強力な機能と柔軟性を活用できます。これらの関数を使用すると、リレーショナル・データを使用したXMLデータの構成、XML同様のリレーショナル・データに対する問合せ、およびXMLデータからのリレーショナル・データの構成が可能です。
SQL関数XMLExists
およびXMLCast
については、この章の別の項で説明します。この項では、関数XMLQuery
とXMLTable
について説明しますが、この章の例の大半はXMLExists
およびXMLCast
も使用します。一般的な使用方法は次のとおりです。
-
XMLQuery
とXMLCast
は通常、SELECT
リストで使用します。 -
XMLTable
は一般的にSQLのFROM
句で使用します。 -
XMLExists
は通常、SQLのWHERE
句で使用します。
XMLQuery
とXMLTable
の両方がXQuery式を評価します。XQuery言語では、式は常に項目のシーケンスを戻します。関数XMLQuery
はこのシーケンスの項目を集計し、単一のXML文書または断片を戻します。関数XMLTable
は、XQueryシーケンスからの1つの項目を各行に含むSQL表を戻します。
関連項目:
-
OracleによるSQL/XML標準のサポートの詳細は、Oracle Database SQL言語リファレンスを参照してください。
-
XQuery言語の詳細は、
http://www.w3.org/TR/xquery-30/
を参照してください。 -
Oracle XML DBでの他のSQL/XML関数の使用方法の詳細は、SQL関数を使用したXMLデータの生成を参照してください。
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
およびXQueryidentifier
が続いている必要があります。それぞれの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言語リファレンスを参照してください。
Oracle XML DBのXMLTABLE SQL/XML関数
SQL/XML関数XMLTable
は、XQuery式の評価結果を新規の仮想表に対するリレーショナル行と列に分解します。このデータは、既存のデータベース表に挿入でき、またSQLを使用して(join式など)問合せできます。
XML_namespaces_clause ::=
XMLTABLE_options ::=
XML_passing_clause ::=
XML_table_column ::=
-
XQuery_string
は、XMLTableコールの行パターンと呼ばれる場合があります。これは、リテラル文字列としての完全なXQuery式で、プロローグを含む場合があります。式の値はXMLTable
関数への入力となります。つまり、このXQueryの結果が分解されリレーショナル・データとして格納されます。 -
オプションの
XMLNAMESPACES
句にはXML名前空間宣言が含まれており、XML_table_column
のPATH
句で、XQuery_string
およびXPath式により参照されます。 -
XML_passing_clause
はキーワードPASSING
に1つ以上のSQL式(expr
)を続けたもので、それぞれXMLType
インスタンスまたはSQLスカラー・データ型の(つまり、オブジェクト・データ型でもコレクション・データ型でもない)インスタンスを戻します。それぞれの式(expr
)は、適切にキャストされた表またはビューの列の値、PL/SQL変数、バインド変数のいずれかになります。1つを除いてすべての式では、その後にAS
およびXQueryidentifier
が続いている必要があります。それぞれの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
データを戻すことで、ソース・データにおいてcolumn
のPATH
式でターゲットとなっているノード外のノードをターゲットにするその他の列を指定できます。例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言語リファレンスを参照してください。
SQL/XML関数XMLTABLEのコールのチェーン
XMLType
表に複数レベルで含まれているデータをリレーショナル表(またはビュー)の個別の行として公開する必要がある場合は、単一レベルの分割と同じ一般的な方法を使用します。つまり、SQL/XML関数XMLTable
を使用して、表を構成する列の定義および列へのXMLノードのマッピングを行います。
ただし、この場合は、分割してリレーショナル列に格納する各文書レベルに関数XMLTable
を適用します。複数のXMLTable
コールをチェーンするこの技術は、XMLType
表内の文書とリレーショナル表内の行との間に、1対多(1:N)関係がある場合はいつでも使用します。
1つのレベルのXMLType
データを、あるXMLTable
コールから次のコールに渡し、その列タイプをXMLType
で指定します。
2つのXMLTable
コールをチェーンする場合、各コールの行パターンは、そのコールの列パターンで参照されるすべてのノードに対して共通の祖先である最深ノードを対象とします。
これについては例4-1に示しています。
XMLType
表po_binaryxml
の各PurchaseOrder
要素にLineItems
要素が含まれていて、この要素に1つ以上のLineItem
要素が含まれているとします。各LineItem
要素には、Description
やItemNumber
属性などの子要素があります。このような下位レベルのデータをリレーショナル値としてアクセス可能にするには、XMLTable
を使用してLineItem
要素のコレクションを投影します。
要素PurchaseOrder
を、XMLTable
の最初のコールで分割すると、その子孫であるLineItem
要素は、XMLフラグメントが含まれている型XMLType
の列にマップされます。この列は次に、XMLTable
への2回目のコールに渡され、リレーショナル値の複数の列として複数の部分に分割されます。
XMLTable
の最初のコールでは、/PurchaseOrder
を行パターンとして使用します。これは、PurchaseOrder
が、列パターンReference
およびLineItems/LineItem
の最深の共通祖先ノードであるためです。
XMLTable
の2回目のコールでは、/LineItem
を行パターンとして使用します。これは、そのノードが、各列パターン(@ItemNumber
、Description
、Part/@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;
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
およびXQueryidentifier
が続いている必要があります。それぞれの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
をコールした場合、XMLExists
はfalse
を戻します。
関数XMLExists
は、問合せ内で使用できます。また、問合せの評価を高速化するためのファンクション索引を作成する場合にも使用できます。
ノート:
Oracle XML DBは、XMLExists
の使用をSQLのWHERE
句またはCASE
式に制限します。XMLExists
をSELECT
リストの中で使用する必要がある場合は、次のようにそれを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
を使用できます。
ノードを検索するためのXMLExistsの使用
SQL/XML標準関数XMLExists
を使用して、特定のノードを検索できます。XMLExists
を使用してファンクション索引を作成できます。また、XMLIndex
索引を作成して、任意のXQuery検索を高速化することもできます。
例4-2では、XMLExists
を使用して、SpecialInstructions
がExpedite
に設定されている行を選択します。
例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.
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
を適用すると、テキスト・ノードが連結されて戻され、エラーは発生しません。
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.
URIスキームoradb: XQueryを使用した表またはビュー・データの問合せ
XQuery関数fn:collection
を使用して、データベースの表およびビュー内のデータを問い合せることができます。
XQuery関数fn:doc
とfn: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-SCHEMA
にPUBLIC
を使用できます。 -
リレーショナル
の表またはビュー内のXMLType列の場合oradb:/DB-SCHEMA/REL-TABLE/ROWPRED/X-COL
REL-TABLE
はリレーショナル表またはビューで、PRED
はXMLType
列と関係しないXPath述語です。X-COL
はREL-TABLE
のXMLType
列です。PRED
はオプションで、DB-SCHEMA
、REL-TABLE
およびX-COL
は必須です。
オプションのXPath述語PRED
は、次の条件を満たす必要があります。
-
XMLType
列が一切関係しない。 -
一般的な同等の結合(
and
)と分離(or
)および不等の比較(=
、!=
、>
、<
、>=
、<=
)のみが関係している。 -
それぞれの比較演算について、
REL-TABLE
の両側の名前(XML以外)列、またはある列と他方のような一方の名前が、表4-3で指定された正しい型の値である。他の型を使用すると、エラーが発生します。
表4-3 oradb式: 比較用の列の型
リレーショナルの列の型 | XQuery値の型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
たとえば、このXQuery式は、表oe.warehouses
のXMLType
列warehouse_spec
にあって、列warehouse_id
の値が6より小さい行のすべてのXML文書を表します。
fn:collection('oradb:/OE/WAREHOUSES/ROW[WAREHOUSE_ID < 6]/WAREHOUSE_SPEC')
Oracle XQuery拡張関数
Oracle XML DBには、W3C標準に用意されているものの他に、いくつかのXQuery関数が追加されています。それらの追加関数はOracle XML DB名前空間、http://xmlns.oracle.com/xdb
にあります。この名前空間は事前定義の接頭辞ora
を使用します。
ノート:
ora:sqrt XQuery関数
Oracle XQuery関数ora:sqrt
は、数値引数の平方根を戻し、引数はXQuery型xs:decimal
、xs:float
、またはxs:double
のいずれかです。戻り値のXQuery型は引数と同じです。
ora:sqrt構文
ora:sqrt (number)
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
Oracle XQuery拡張式プラグマ
W3CのXQuery仕様では、実装により定義された拡張式を実装で提供できます。XQuery拡張式は、カッコ({
、 }
)で囲まれたXQuery式で、実装で定義されたプラグマが接頭辞になります。Oracle実装では、このような複数のプラグマを提供します。
ここに記載したプラグマ以外のプラグマは認識されません。その他のプラグマ、すなわち不正なプラグマ・コンテンツを持つプラグマ(たとえば、(#ora:view_on_null something_else #)
)を使用すると、エラーが発生します。
ora:view_on_null
の例では、null_test
表にVARCHAR2(10)
型の列a
とb
があり、列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_rewrite
とora: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('®ION' 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;
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:collection
とoradb
によりリレーショナル・データをラップし忘れる誤りはよくあることですが、静的型チェックがないと、診断が困難な場合があります。例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)
Oracle XML DBでのXQueryサポート
Oracle XML DBのXQuery言語サポートには、SQLサポートとXQueryの関数と演算子のサポートが含まれます。
XQueryとSQLのサポート
Oracle XML DBのXQuery言語サポートは、リレーショナル記憶域の使用範囲とXMLデータの問合せの使用範囲のベスト・フィットの実現を目指しています。Oracle XML DBは一般的なXQuery実装ですが、それと同時に、リレーショナル問合せとXML問合せの連携動作に特に注意して設計されています。
この項では、Oracle XML DBのXQuery実装の個別のプロパティについて説明します。XQuery標準は、言語処理の一部の特性について、実装により定義されるのか、実装に依存するのかを明示的にコール・アウトしています。また、XQuery標準で規定されているが、Oracle XML DBでサポートされていない機能もいくつかあります。
関連トピック
XQuery標準で指定された実装の選択肢
XQuery標準では、実装により定義される言語処理のいくつかの点が指定されています。
-
暗黙的タイムゾーン・サポート: Oracle XML DBでは、暗黙的タイムゾーンを常に
Z
と仮定しています。タイムゾーンのないxs:date
、xs:time
およびxs:datetime
のインスタンスは、自動的にUTCに変換されます。 -
copy-namespaces
のデフォルト値–copy-namespaces
宣言のデフォルト値(XQuery Updateで使用)はinherit
です。 -
再検証モード – XQuery Update変換式の再検証のデフォルト・モードは
skip
です。ただし、変換式の結果が、XMLType
表または列内のXML Schemaに基づくデータに対する更新である場合は、XML Schemaの検証が適用されます。
Oracle XML DBでサポートされていないXQuery機能
Oracle XML DBではサポートされていない、XQuery標準で規定されている機能を示します。
-
copy-namespacesモード–Oracle XML DBで
copy-namespaces
宣言についてサポートされるのは、preserve
とinherit
のみです。既存の要素ノードが要素コンストラクタまたは文書コンストラクタによりコピーされた場合、元の要素の範囲にあるすべてのネームスペースはコピー内に保持されます。そうでない場合は、コピーされたノードは構築されたノードの範囲内にあるすべてのネームスペースを継承します。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
。
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関数のオプションの照合パラメータ。
XQuery関数fn:doc、fn:collectionおよびfn:doc-available
Oracle XML DBでは、Oracle XML DBリポジトリにあるすべてのリソースについて、XQuery関数fn:doc
、fn:collection
およびfn:doc-available
がサポートされています。
関数fn:doc
はURI引数によりターゲットとされているリポジトリのファイル・リソースを戻します。このリソースは整形式のXMLデータのファイルにしてください。関数fn:collection
も同様ですが、リポジトリのフォルダ・リソースに対して機能します(フォルダ内の各ファイルには整形式のXMLデータが含まれている必要があります)。
Oracle URIスキームoradb
とともに使用すると、fn:collection
は既存のリレーショナル・データからその場で派生した、リポジトリにないXMLデータを戻すことができます。
XQuery関数fn:collection
は、URIスキームoradb
とともに使用した場合、ターゲットの表やビュー、列が存在しないと、エラーが発生します。関数fn:doc
とfn:collection
では、引数として引き渡されたリポジトリのリソースが見つからない場合、エラーは発生しません。かわりに、空のシーケンスが戻されます。
任意の文書が存在するかどうかは、XQuery関数fn:doc-available
を使用して判断できます。文書の引数が存在する場合はtrue
、存在しなければfalse
がそれぞれ戻されます。
関連項目:
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に基づいた実装から導かれたものです。
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を認識しません。
XMLExistsでのXQuery Full Textの使用制限
SQL/XML関数XMLExists
とともにXQuery Full Textを使用する場合、制限が指定されています。
SQL/XML関数XMLExists
のPASSING
句にSQL式として渡すことのできるXMLType
インスタンスは1つのみで、同じ句内に含まれるその他の非XMLType
SQL式はすべて、組込みSQLデータ型のコンパイル時定数、またはこのようなデータ型のインスタンスにバインドされているバインド変数のいずれかである必要があります。この制限を順守しないと、コンパイル時エラーORA-18177が発生します。
サポートされている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"
は使用できます。
サポートされているXQuery Full TextのMatchオプション
Oracle XML DBでは、XQuery Full Textのmatchオプションのサブセットがサポートされています。
Oracle XML DBでは、次に示すXQuery Full Textのmatchオプションのみをサポートしています。適用される制限がある場合は注記します。「する必要があります」、「しないでください」という言葉が使用されている場合、指定された制限を順守しないとエラーが発生します。ここにリストされていないmatchオプションを使用すると、エラーが発生します。
-
FTStemOption (
stemming
、no stemming
)
次の例外を除いて、XQueryおよびXPath Full Text 1.0勧告で指定されているデフォルト動作が、サポートされていない各matchオプションに使用されています。
-
FTLanguage (サポート対象外) - 使用されている言語は、デフォルト・レクサーで定義された言語、すなわちデータベースのインストール時に使用された言語です。
-
FTStopWordOption (サポート対象外) - 使用されているストップリストは、その言語に定義されたストップリストです。
関連項目:
-
デフォルト・レクサーについては、Oracle Textリファレンスを参照してください。
-
サポートされる各言語に使用されているストップリストについては、Oracle Textリファレンスを参照してください。
サポート対象外の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で使用)
XQuery Full Textのエラー
XQuery Full Textの使用時に発生することがあるコンパイル時エラーについて説明します。
OracleでサポートされていないXQuery Full Text (XQFT)機能を使用すると必ずコンパイル時エラーが発生します。
また、対応するXML検索索引が作成されていないか、またはその索引が取得されていない場合、サポートされているXQFT式をSQL WHERE
句(通常はXMLExists
)内で使用すると必ずコンパイル時エラーORA-18177が発生します。
関連トピック
関連項目:
-
XML検索索引の作成およびエラーORA-18177の処理の詳細は、全文問合せ用のXMLデータの索引付けを参照してください。
-
forwardおよびdescendent以外の軸の詳細は、XQuery用のパフォーマンス・チューニングを参照してください。
-
SQLの組込みデータ型の詳細は、Oracle Database SQL言語リファレンスを参照してください。
脚注の説明
脚注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
という名前でした。読みやすさのために名前が変更されていますが、内容には変更ありません。