XQueryでエラーになる原因のだいたいの要因
XMLが整形式になっていないから・・
DB2でXMLを出力する際、「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でつまづくであろう箇所ではないかとおもうので、ちょっと取り上げてみました。
参考になれば・・です。