Oracle de XMLDB #14 Tweet
また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を使って ";"を無視させた方が便利で簡単ですね。
| 固定リンク | 0
コメント