« Oracle de XMLDB #13 | トップページ | Dashboard Widget Top50 - 2007/12/15 »

2007年12月14日 (金) / Author : Hiroshi Sekiguchi.

Oracle de XMLDB #14

またXMLマスタープロフェッショナル(DB)試験ネタからは少々脱線している・・・。と気付きつつも、気になるとやらずに居られない性分なので。



● バックナンバー

Oracle de XMLDB #1

Oracle de XMLDB #2

Oracle de XMLDB #3 - Oracle10g XEではどうよ?

Oracle de XMLDB #4

Oracle de XMLDB #5 - Oracle11g環境再構築完了

Oracle de XMLDB #6 - Linux x86版再び。

Oracle de XMLDB #7 - 何かが違う!?

Oracle de XMLDB #8 - またまた少々脱線

Oracle de XMLDB #9 - またまた少々脱線の続き

Oracle de XMLDB #10 - 三度脱線

Oracle de XMLDB #11 - 三度脱線のおまけ

Oracle de XMLDB #12

Oracle de XMLDB #13


前々回にも書いたがSQL*Plusでは、";"を入力してしまうとそれまで入力したSQL文を実行してくれる。

ただ、SQL文や、XQueryコマンドの実行には問題ないのだが、SQL/XMLでは少々困った問題を引き起こすんです。

以下の例をご覧ください。

> conn scott/tiger
接続されました。
SCOTT>
SCOTT>
SCOTT> select
2 xmlquery(
3 'xquery version "1.0";
ERROR:
ORA-01756: 引用符付き文字列が正しく終了していません

そうなんです!。
xmlquery()関数内あっても ";"(セミコロン)を入力する必要があるのですが、入力した時点で実行しようとしてしまうんです。(><)

これには困りました!。

無理矢理な対処として、エラーになっても気にせず前述のように入力後、SQL*Plusのeditコマンドで編集する方法もありますが、今回はマニュアル Oracle® XML DB Developer's Guide 11g Release 1 (11.1) - Using Namespaces with XQueryにも書かれている方法でやってみましょう。

● ";"(セミコロン)の後にXQeuryのコメントを付加する方法

SCOTT> 
SCOTT> select
2 xmlquery(
3 'xquery version "1.0"; (::)
4 declare namespace mo = "http://192.168.1.20/my_namespace"; (::)
5 declare function mo:phoneNumber($phone)
6 {
7 $phone/text()
8 }; (::)
9 (: query body :)
10 <result>
11 {
12 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
13 return
14 <greeting>
15 { fn:concat("Hello, ", mo:phoneNumber($i)) }
16 </greeting>
17 }
18 </result>'
19 returning content
20 )
21 from
22 dual
23 .
SCOTT> /

XMLQUERY('XQUERYVERSION"1.0";(::)DECLARENAMESPACEMO="HTTP://192.168.1.20/MY_NAME
--------------------------------------------------------------------------------
<result><greeting>Hello, 03-1234-5555</greeting><greeting>Hello, 090-4321-7878</
greeting><greeting>Hello, 070-7777-8798</greeting><greeting>Hello, 06-1234-5555<
/greeting><greeting>Hello, 06-6860-0001</greeting><greeting>Hello, 090-6666-7878
</greeting><greeting>Hello, 080-9999-8798</greeting><greeting>Hello, 06-6860-000
1</greeting><greeting>Hello, 090-0066-0108</greeting><greeting>Hello, 090-3020-2
897</greeting></result>


SCOTT>


● 次は、";"(セミコロン)を無視させる方法。

SCOTT> set sqlterm off
SCOTT> select
2 xmlquery(
3 'xquery version "1.0";
4 declare namespace mo = "http://192.168.1.20/my_namespace";
5 declare function mo:phoneNumber($phone)
6 {
7 $phone/text()
8 };
9 (: query body :)
10 <result>
11 {
12 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
13 return
14 <greeting>
15 { fn:concat("Hello, ", mo:phoneNumber($i)) }
16 </greeting>
17 }
18 </result>'
19 returning content
20 )
21 from
22 dual
23 .
SCOTT> /

XMLQUERY('XQUERYVERSION"1.0";DECLARENAMESPACEMO="HTTP://192.168.1.20/MY_NAMESPAC
--------------------------------------------------------------------------------
<result><greeting>Hello, 03-1234-5555</greeting><greeting>Hello, 090-4321-7878</
greeting><greeting>Hello, 070-7777-8798</greeting><greeting>Hello, 06-1234-5555<
/greeting><greeting>Hello, 06-6860-0001</greeting><greeting>Hello, 090-6666-7878
</greeting><greeting>Hello, 080-9999-8798</greeting><greeting>Hello, 06-6860-000
1</greeting><greeting>Hello, 090-0066-0108</greeting><greeting>Hello, 090-3020-2
897</greeting></result>


SCOTT>

SQL/XMLやXQueryを実行する場合には、SET SQLTERMINATOR OFFを使って ";"を無視させた方が便利で簡単ですね。

| |

トラックバック


この記事へのトラックバック一覧です: Oracle de XMLDB #14:

コメント

コメントを書く