!!!DB2 XQuery [XML][XQuery] *DB2 XML DB (pureXML) *[IBM のマニュアル|http://www-05.ibm.com/e-business/linkweb/puc/jsp/index.jsp?country=760&language=JPN] からのメモ *World Wide Web Consortium (W3C) によって設計された機能プログラミング言語 !!!XMLデータ ::柔軟 *XMLデータは柔軟で、予測不能で、散在しており、自己記述的 ::XQueryを使うしかない局面 *階層のどのレベルにあるか不明なオブジェクトのXMLを検索 *データにタイして構造変換を実行 *タイプが混合した結果を戻す *既存のXMLを更新 !!!照会のコンポーネント !!プロローグと照会本体からなる *プロローグには、照会処理環境を定義する一連の宣言 xquery version "1.0"; declare default element namespace "http://posample.org"; {for $prod in db2-fn:xmlcolumn("PRODUCT.DESCRIPTION")/product/description order by xs:decimal($prod/price) descending return {$prod/name, $prod/price}} !!!XQuery と SQL/XML *XQuery を直接呼び出す照会は、キーワード XQUERY で始まる。 *SQL/XMLでは、以下の関数と述部を指定してSQLからXQueryを呼び出す ,キーワード/関数/述部,内容 ,XQUERY,XQueryが使用されることを示し、大/小文字を区別する規則をサーバーに指示 ,XMLQUERY,引数としてXQuery式を使用し、XMLシーケンスを戻す関数 ,XMLTABLE,XQuery式を使用してXMLデータからSQLの表を生成関数 ,XMLEXISTS,XQuery式が1つ以上の項目のシーケンスを戻すか判別する述部 !!!XQuery 関数を使用したDB2データの検索 *XQuery では以下のいずれかの関数でDB2からXMLデータを取得できる ,関数,概要,例 ,db2-fn:xmlcolumn,XML列を識別するリテラル引数を使用,db2-fn:xmlcolumn('BUSINESS.ORDERS.PURCHASE_ORDER')/shipping_address/city ,db2-fn:sqlquery,fullselectを表す引数を使用。SQLの機能を使用できる,db2-fn:sqlquery("SELECT purchase_order FROM business.orders WHERE ship_date = '2005-06-15' ")/shipping_address/city ""SQLは大文字、小文字を区別しないが、XMLは区別する。SQLは通常、自動的に大文字に変換されるが、XMLと混在する場合は明示的に大文字として記述する必要がある。ただし、二重引用符で囲むことで、SQLでも大文字小文字を区別するようにすることもできる。 !!!XQuery および XPath のデータ・モデル !!XDM *XQuery 式は、XQuery およぼ XPath のデータモデル XDM のインスタンスに対して作動し、XDMのインスタンスを戻す。 *XDMはアトミック値およびノードのシーケンスで説明される !!シーケンスおよび項目 *シーケンスとは 0個以上の項目の順序づけられたコレクション *項目はアトミック値またはノード !シーケンスの記法 *各項目はカンマで区切る *全体は括弧で囲む *空の括弧は、空のシーケンス *単独の項目は、一つの項目を含むシーケンスと等価 *ネストできない ::例 *36 * *(2,3,4) *(36,,"cat") *() !!アトミック値 *組み込みアトミックデータ・タイプの1つのインスタンス *ストリング、整数、10進数、日付などこれ以上分割できない !!ノード階層 *シーケンスのノードは、1つ以上の階層を形成する。 *DB2は、文書、エレメント、属性、テキスト、処理命令、コメント ノードをサポート Fleece jacket 19.99 Nylon pants 9.99 *products というルートエレメントが含まれる *ルートエレメントに product エレメントが含まれる *product エレメントには、pid という属性と、description という子エレメントを持つ !!ノードのプロパティ *各ノードは以下の1つ以上のプロパティを持つことができる ,プロパティ,内容 ,node-name,QName として表現されるノードの名前 ,parent,現行ノードの親ノード ,type-name,ノードの動的タイプ ,children,現行ノードの子であるノードのシーケンス ,attributes,現行ノードに属する属性ノードのセット ,string-value,ノードから抽出可能なストリング値 ,typead-value,ノードから抽出可能な0個以上のアトミック値のシーケンス ,in-scope namespaces,ノードに関連づけられた範囲のネーム・スペース ,content,ノードの内容 !!DB2がサポートする6つのノード種類 ,ノード種類,内容 ,文章ノード,XML文章をカプセル化 ,エレメントノード,XMLエレメントをカプセル化 ,属性ノード,XML属性を意味する ,テキストノード,XMLの文字内容をカプセル化 ,処理命令ノード,XML処理命令をカプセル化 ,コメントノード,XMLコメントをカプセル化 !!XDMのシリアライゼーション *XQuery式の結果はXDMのインスタンスだが、シリアライゼーションを行い、XML表記に変換可能 *XMLSERIALIZE関数でも実行できる !!!XMLネームスペースと QName *XMLネームスペースは、命令の衝突を回避 *XMLネームスペースは、URIによって識別される名前のコレクション *XQueryのエレメント、属性、データタイプ、関数に使用される名前の修飾方法が提供される ""ネームスペース接頭部で修飾された名前が修飾名(QName) !!QNameの構成 *オプションのネームスペース接頭部+ローカル名 (:で区切る)で構成 *照会の処理時に、ネームスペース接頭部にバインドされているURIを解決 ""QName は、W3C勧告 Namespace in XML で定義される構文に準拠 !静的に既知のネームスペース ::事前宣言されたネームスペース ,接頭部,XML ,xml,http://www.w3.org/XML/1998/namespace ,xs,http://www.w3.org/2001/XMLSchema ,xsi,http://www.w3.org/2001/XMLSchema-instance ,fn,http://www.w3.org/2005/xpath-functions ,xdt,http://www.w3.org/2005/xpath-datatypes ,db2-fn,http://www.ibm.com/xmlns/prod/db2/functions ::静的に既知のネームスペースセットを提供 *ネーム・スペース宣言またはデフォルト・ネーム・スペース宣言を使用 declare namespace ns1 = "http://mycompany.com"; ""接頭部 ns1 が URI http://mycompany.com と関連付けられる *エレメント・コンストラクターのネーム・スペース宣言属性によって宣言 14.99 ""エレメントの有効範囲内で接頭部 ns2 を URI http://mycompany.com にバインド *SQL/XML によって提供 **SQL/XMLの事前宣言されたネーム・スペース **SQL/XML コンストラクターおよびその他の SQL/XML 式で宣言されるネーム・スペース !!!タイプ・システム *XQuery は強く型付けされた言語 *XQuery のタイプ・システムには、XMLスキーマの組み込みタイプおよび、XQueryの事前定義タイプが含まれる *XML スキーマの組み込みタイプは、http://www.w3.org/2001/XMLScheme にあり、接頭部 xs を持つ **xs:integer、xs:string など *XQuery 事前定義タイプは、http://www.w3.org/2005/xpath-datatypes にあり、接頭部 xdt を持つ **xdt:untypedAtomic、xdt:yearMonthDuration など !!タイプ階層 *すべてのアトミック・タイプは、データ・タイプ xdt:anyAtomicType から派生 {{ref xdt_hierarchy.jpg}} !!!プロローグ *照会の処理環境を定義する一連の宣言 !!宣言 ,宣言,内容,例 ,バージョン宣言,XQuery の構文およびセマンティクスのバージョン,xquery version "1.0"; ,境界スペース宣言,エレメント・コンストラクターによる境界空白の処理方法,declare boundary-space preserve; ,構成宣言,構成モードを設定,declare construction strip; ,Copy-namespaces 宣言,ネーム・スペースのバインディングを制御,declare copy-namespaces preserve,inherit; ,デフォルトのエレメント/タイプのネーム・スペース宣言,接頭部なしの QNamesに使用するネーム・スペースを指定,declare default element namespace "http://posample.org"; ,デフォルトの関数ネーム・スペース宣言,関数呼び出しの接頭部が付かない関数に使用されるネーム・スペース URI を指定,declare default function namespace "http://www.ibm.com/xmlns/prod/db2/functions"; ,空の順序宣言,FLWOR 式の order by 節が処理されるときの空のシーケンスまたは NaNの最大最小としての解釈,declare default order empty greatest; ,順序付けモード宣言,照会の順序付けモード,declare ordering unordered; ,ネーム・スペース宣言,ネーム・スペース接頭部を宣言,declare namespace ns1 = "http://posample.org"; !!!式 *照会の基本的なビルディング・ブロック *単独で使用することも、他の式と組み合わせて複合照会を形成することも可能 *いくつかの操作は、式の処理によく含められる。 *更新式は変換式の modify 節内でのみ使用できる !!動的コンテキストおよびフォーカス ,フォーカスの構成要素,内容 ,コンテキスト・アイテム,現在処理中のアトミック値またはノード。ドット"."でアイテムを検索可能 ,コンテキストの位置,コンテキスト・アイテムの位置。fn:position() 関数によって検索可 ,コンテキスト・サイズ,アイテム数。fn:last()関数によって検索可 !!基本式 !リテラル *アトミック値の直接構文表記 ,リテラル,タイプ,内容 ,数値,xs:integer、xs:decimal、xs:double,数値、 e または E 、小数点からなる ,ストリング,xs:string,単一引用符 (')または二重引用符(")に囲まれたアトミック値。単一引用符で区切られたストリング・リテラル内に単一引用符を含めるには、2 つの連続する単一引用符を指定 !!変数参照 *変数参照は、ドル記号 ($) が先頭に付加された NCName !変数を有効範囲内に追加 *ホスト言語環境、SQL/XML、XMLQUERY 関数、 XMLTABLE 関数、または XMLEXISTS 述部によって有効範囲内変数に追加 *XQuery 式によって変数を値にバインド **変数をバインドできる式は、FLWOR 式および量化式 **関数呼び出しも、関数本体を実行する前に、関数の仮パラメーターに値をバインド **バインドされた式全体を通して有効範囲内 ::例 *FLWOR 式が、変数 $seq をシーケンス (10, 20, 30) にバインド let $seq := (10, 20, 30) return $seq[2]; ""戻り値は 20 !!コンテキスト・アイテム式 *1 個のピリオド文字 (.) から構成 *現在処理中の項目 (コンテキスト・アイテム) に評価 ::例 *範囲式 1 to 100 で戻されるシーケンスのすべての項目に係数演算子を呼び出すコンテキスト・アイテム式 (1 to 100)[. mod 5 eq 0] ""1 から 100 までの数字で、5 で均等に割り切れる整数のシーケンス !!関数呼び出し *QName と、その後に続く括弧で囲んだ 0 個以上の式のリスト(これを引数と呼びます) で構成 **組み込み XQuery 関数、 DB2 固有の関数の呼び出しをサポート !例 ::ストリング引数を使用した関数呼び出し *引数を取り、すべての文字が大文字である xs:string タイプの値を戻 fn:upper-case($ns1_customerinfo/ns1:addr/@country) ::シーケンス引数を使用した関数呼び出し *単一引数として、シーケンス (1, 2, 3) を取ります fn:max((1, 2, 3)) !!パス式 *XML ツリー内のノードを識別 *XPath 2.0 の構文に基づく *パス式は、スラッシュ (/) またはダブルスラッシュ (//) 文字で区切られた 1 つ以上のステップで構成 !構文 *各ステップは、軸ステップまたはフィルター式のいずれか ,パス式,内容 ,軸ステップ,指定された軸によってコンテキスト・ノードから到達できるノードのシーケンスを戻す ,フィルター式,基本式と、それに続く 0 個以上の述部で構成 {{ref_image xpath_expression.jpg}} ,記号,説明 ,/,パスが、コンテキスト・ノードを含むツリーのルート・ノードから開始されることを示す。パス式内のスラッシュ文字は、ステップを分離 ,//,パスが、コンテキスト・ノードを含むツリーのルート・ノードと、そのルート・ノードのすべての子孫で構成される初期ノード・シーケンスから開始されることを示す。ステップ間のダブルスラッシュ文字は、省略構文参照 ,axis,XML 文書またはフラグメントの移動方向。child、descendant、attribute、self、descendant-or-self、parent などをサポート ,node-test,軸ステップによって選択される各ノードについて true でなければならない条件 ,PrimaryExpression,基本式 ,PredicateExpression,シーケンスの項目が保持されているか、廃棄されているかを判別する式 !例 ::2つの述部を含む軸ステップ *secretary 子エレメントおよび assistant 子エレメントの両方を持つ、コンテキスト・ノードの子であるすべての employee を選択 child::employee[secretary][assistant] ::パス式内のステップとしてフィルター式を使用 *指定された book 内で複数の footnote を含むすべての chapter または appendixを戻す $book/(chapter | appendix)[fn:count(footnote)> 1] !!軸ステップ ::構成 *軸、ノード・テスト、述部の 3 つの部分から構成 *オプションの軸 は、移動の方向を指定 *ノード・テストは、ノードの選択に使用する基準を指定 *軸ステップの結果は、常にゼロ以上のノードのシーケンス ::フォワード・ステップとリバース・ステップ *軸ステップは、フォワード・ステップまたはリバース・ステップに分けられる ,ステップ,内容 ,フォワード・ステップ,コンテキスト・ノードから開始し、文書の順序で XMLツリーを移動 ,リバース・ステップ,コンテキスト・ノードから開始し、文書の順序の逆で XML ツリーを移動 ::例 *child が軸の名前、para がこの軸上で選択されるエレメント・ノードの名前 child::para ""この例の軸ステップでは、コンテキスト・ノードの子であるすべての para エレメントを選択 !!軸 *XML 文書内を移動する方向を指定する軸ステップの一部 *軸は、フォワード軸またはリバース軸のいずれかに分類 !DB2 XQuery でサポートされる軸 ,軸,方向,説明 ,child,順,コンテキスト・ノードの子 ,descendant,順,コンテキスト・ノードの子孫 ,属性,順方,コンテキスト・ノードの属性 ,self,順,コンテキスト・ノードのみ ,descendant-or-self,順,コンテキスト・ノードおよびコンテキスト・ノードの子孫 ,parent,逆,コンテキスト・ノードの親 !!!ノード・テスト *軸ステップにより選択される各ノードについて true でなければならない条件 *名前テストまたは種類テスト !!名前テスト *QName またはワイルドカードで構成 *軸ステップで名前テストが指定されると、ステップは、QName またはワイルドカードに一致する指定された軸上のノードを選択 !DB2 XQuery でサポートされる名前テスト ,テスト,説明,例,例の説明 ,QName,QNameに等しい(指定された軸上の)任意のノードに一致,child::para,名前テスト para は、子軸上のすべての paraエレメントを選択 ,*,指定された軸上のすべてのノードに一致,child::*,子軸上のすべてのエレメントに一致 ,NCName:*,QName の接頭部部分を表す NCNameを指定,child::ns1:*,接頭部 ns1 にバインドされているネーム・スペースに関連付けられた子軸上のすべてのエレメントに一致 ,*:NCName,QName のローカル部分を表すNCNameを指定,child::*:customerinfo,エレメント名に関連付けられたネーム・スペースには関係なく、ローカル名 customerinfo を持つ、子軸上のすべてのエレメントに一致 !!種類テスト *種類テストに一致する指定された軸上のノードのみを選択 ! DB2 XQuery でサポートされる種類テスト ,テスト,説明,例,例説明 ,node(),指定された軸上の任意のノード,child::node(),子軸上の任意のノードを選択 ,text(),指定された軸上の任意のテキスト・ノードに一致,child::text(),子軸上の任意のテキスト・ノードを選択 ,comment(),指定された軸上の任意のコメント・ノードに一致,child::comment(),子軸上の任意のコメント・ノードを選択 ,processing-instruction(),指定された軸上の任意の処理命令ノードに一致,child::processing-instruction(),子軸上の任意の処理命令ノードを選択 ,element() または element(*),指定された軸上の任意のエレメント・ノードに一致し,child::element(),子軸上の任意のエレメント・ノードを選択 ,attribute() または attribute(*),指定された軸上の任意の属性ノードに一致,child::attribute(),子軸上の任意の属性ノードを選択 ,document-node(),指定された軸上の任意の文書ノードに一致,self::document-node(),コンテキスト・ノードである文書ノードを選択 !!パス式の省略構文 ,省略構文,説明,省略例,元構文 ,軸の指定なし,ノード・テストとして軸ステップがattribute() を指定したとき以外は、child::の省略形。軸ステップが属性テストを指定するときは、省略される軸は、attribute:: の省略形です。,section/para,child::section/child::para ,@,attribute:: の省略形,section/@id,child::section/attribute::id ,//,パス式の先頭にあるとき以外は、/descendant-or-self::node()/ の省略形,div1//para,child::div1/descendant-or-self::node() /child::para ,..,parent::node() の省略形,../title,parent::node()/child::title