トップ 一覧 ping 検索 ヘルプ RSS ログイン

DB2 XQueryの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!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";
 <!-- 照会本体 -->
 <price_list>{for $prod in db2-fn:xmlcolumn("PRODUCT.DESCRIPTION")/product/description
   order by xs:decimal($prod/price) descending
   return <product>{$prod/name, $prod/price}</product>}
 </price_list>
!!!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
*<dog/>
*(2,3,4)
*(36,<dog/>,"cat")
*()
!!アトミック値
*組み込みアトミックデータ・タイプの1つのインスタンス
*ストリング、整数、10進数、日付などこれ以上分割できない
!!ノード階層
*シーケンスのノードは、1つ以上の階層を形成する。
*DB2は、文書、エレメント、属性、テキスト、処理命令、コメント ノードをサポート
 <products>
   <product pid="10">
     <description>
     <name>Fleece jacket</name>
     <price>19.99</price>
     </description>
   </product>
   <product pid="11">
     <description>
       <name>Nylon pants</name>
       <price>9.99</price>
     </description>
   </product>
 </products>
*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  と関連付けられる
*エレメント・コンストラクターのネーム・スペース宣言属性によって宣言
 <ns2:price xmlns:ns2="http://mycompany.com">14.99</ns2:price>
""エレメントの有効範囲内で接頭部 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