XQueryでエラーになる原因のだいたいの要因

XMLが整形式になっていないから・・

DB2XMLを出力する際、「XML型で出てくる」場合は「整形式」でないとエラーになります。

整形型ってなんでしょう?
(もっときちんとした説明が必要でしょうけど・・)

例1

<a>123</a>

これはOk

例2

<a>123</a><b>456</b>

これはNG

XMLはタグ単体では存在できず
ノードの中にタグが必要になります。

なので、例2は

<c><a>123</a><b>456</b></c>

とすればOKなのです。



実際の実行結果
(DB2 DeveloperWorkbenchにて実行)

xquery
  <a>123</a>

result
1	
----------
<a>123</a>

Run successful
xquery
  <a>123</a><b>456</b>

com.ibm.db2.jcc.c.SqlException: An XQuery expression has an unexpected token ">" following "<a>123</a><". Expected tokens may include: "(". Error QName=err:XPST0003.
xquery
  <c><a>123</a><b>456</b></c>

result
1	
----------
<c><a>123</a><b>456</b></c>

Run successful

で、なんでこんなことを書き出したかというと

DB2 9ではXMLがサポートされていますが、基本はRDB列がベースです。
純粋なXMLDBというものを触ったことがないのでわからないのですが
DB2の場合は行にあるXML列(通常列も扱えますが・・)のXMLを扱う
それも列分(列抽出条件はつけれます)。

たとえば

xquery
 for $i in db2-fn:xmlcolumn("BOOKMARK.ITEM")/item/memberid
 return $i
result

result
1	
----------
<memberid>22</memberid>  
<memberid>23</memberid>  
<memberid>24</memberid>  
<memberid>25</memberid>  
<memberid>26</memberid>  
<memberid>27</memberid>  
<memberid>28</memberid>  
<memberid>29</memberid>  

Run successful

と、XQueryを実行すると、BOOKMARKテーブル内の列分のmemberidタグを出力します。
強調しますが「列分」です。

なので1つのXMLとして出力したいとおもったら、真っ先に
returnを{}で囲むでしょう・

xquery
 for $i in db2-fn:xmlcolumn("BOOKMARK.ITEM")/item/memberid 
 return {$i}

com.ibm.db2.jcc.c.SqlException: An XQuery expression has an unexpected token "{" following "m/memberid  
 return". Expected tokens may include: "validate". Error QName=err:XPST0003.

もちろんエラーです(w
何が起きているかというと、例2のようなXMLを作ろうとしてるのですね
こんな感じのを・・

<memberid>22</memberid><memberid>23</memberid>・・・・

ということで、ノードになる部分が足りないわけですので

xquery
 for $i in db2-fn:xmlcolumn("BOOKMARK.ITEM")/item/memberid 
 return <memberids>{$i}<memberids>

ってのもうまくいきません・・
XQueryでいうFLWOR分はプログラム言語で言うfor分に似ているので
「Forで回している最中にreturnで答えを吐き出す」
という意味合いがたぶん近いです。
だから先のXquery

result
1	
----------
<memberids><memberid>22</memberid></memberids> 
<memberids><memberid>23</memberid></memberids> 
<memberids><memberid>24</memberid></memberids> 
<memberids><memberid>25</memberid></memberids> 
<memberids><memberid>26</memberid></memberids> 
<memberids><memberid>27</memberid></memberids> 
<memberids><memberid>28</memberid></memberids> 
<memberids><memberid>29</memberid></memberids> 

Run successful

となんとも情けなく無駄な感じです・・

というころで、forからreturnでひとつってところにきがつけば
{}を使う位置がわかってきましたよね?

xquery
<memberids>
{
 for $i in db2-fn:xmlcolumn("BOOKMARK.ITEM")/item/memberid 
 return $i
}
</memberids>
  
result
1	
----------
<memberids><memberid>22</memberid><memberid>23/memberid><memberid>24</memberid><memberid>25</memberid><memberid>26</memberid><memberid>27</memberid><memberid>28</memberid><memberid>29</memberid></memberids> 

Run successful


正直なところ、まだ{の意味合いを深くきちんとは理解していない自分ではありますが
絶対にXQueryでつまづくであろう箇所ではないかとおもうので、ちょっと取り上げてみました。
参考になれば・・です。