« 大規模Web サイトでのMySQL導入方法および事例紹介」セミナー | トップページ | iTunesベストオブ2007 100曲プレゼントキャンペーン »

2007年12月13日 (木) / Author : Hiroshi Sekiguchi.

Oracle de XMLDB #12

● バックナンバー
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 - 三度脱線のおまけ


DB Magazineに連載されていたXMLマスター実践講座 プロフェッショナル(DB)試験対応 第2回 XQueryの概要にあるLIST1:サンプルのXqueryとほぼ同じクエリをOracle11g R1(Linux x86)のSQL*Plusで試してみる。

Last login: Wed Dec 12 22:18:10 on ttyp1
Welcome to Darwin!
G5Server:˜ discus$ su - oracle
Password:
G5Server:˜ oracle$
G5Server:˜ oracle$ ssh oracle@corydoras
oracle@corydoras's password:
Last login: Wed Dec 12 23:03:58 2007 from 192.168.1.19
[oracle@corydoras ˜]$
[oracle@corydoras ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 水 12月 12 23:04:46 2007

Copyright (c) 1982, 2007, Oracle. All rights reserved.

●まず、addresslist.xmlファイルをOracle XDBリポジトリへ事前に登録しておく。
簡単なXQueryで問い合わせ内容を確認しておきましょう。

> conn scott/tiger
接続されました。
SCOTT>
SCOTT> set long 4000
SCOTT> l
1 xquery
2 for $i in fn:doc("/public/scott/xml/addresslist.xml")
3 return $i
SCOTT> /

Result Sequence
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?><アドレスブック><連絡先><氏名><姓>赤坂</姓
><名>元</名></氏名><住所/><メール><アドレス 区分="プライベート">G.Akasaka@coldma
il.jp</アドレス><アドレス 区分="携帯">G.Akasaka@hardbank.ne.jp</アドレス><アドレ
ス 区分="携帯">G.Akasaka@dokodemo.ne.jp</アドレス></メール><電話><電話番号 区分=
"自宅">03-1234-5555</電話番号><電話番号 区分="携帯">090-4321-7878</電話番号><電
話番号 区分="携帯">070-7777-8798</電話番号></電話></連絡先><連絡先><氏名><姓>麻
布</姓><名>太郎</名></氏名><住所/><メール><アドレス 区分="会社">T.Azabu@taro.co.
jp</アドレス><アドレス 区分="プライベート">T.Azabu@coolmail.jp</アドレス><アドレ
ス 区分="携帯">T.Azabu@a_phone.ne.jp</アドレス><アドレス 区分="携帯">T.Azabu@bu.
ne.jp</アドレス></メール><電話><電話番号 区分="自宅">06-1234-5555</電話番号><電
話番号 区分="会社">06-6860-0001</電話番号><電話番号 区分="携帯">090-6666-7878</
電話番号><電話番号 区分="携帯">080-9999-8798</電話番号></電話></連絡先><連絡先><
氏名><姓>代々木</姓><名>武</名></氏名><住所/><メール><アドレス 区分="プライベー
ト">Y.Takeshi@ba-net.ne.jp</アドレス><アドレス 区分="携帯">Y.Takeshi@dokodemo.ne
.jp</アドレス><アドレス 区分="携帯">Y.Takeshi@bu.ne.jp</アドレス></メール><電話>
<電話番号 区分="会社">06-6860-0001</電話番号><電話番号 区分="携帯">090-0066-0108
</電話番号><電話番号 区分="携帯">090-3020-2897</電話番号></電話></連絡先></アド
レスブック>

● 本来なら問題ない構文から試してみると。。。

SCOTT> (: サンプル :)
2 xquery version "1.0" encoding "utf-8";
(: サンプル :)
*
行1でエラーが発生しました。:
ORA-00928: SELECTキーワードがありません。

あ〜〜〜、XQueryのコメントとして解釈されているのかと思ったが、SQL*PlusではXQueryのコメントから始めることはできないようだ。

NOTE 1)
SQL*PlusでXQueryを利用する場合、XQueryのコメント文から入力してしまうと通常のSQL文と判断してしてしまうので要注意!

NOTE 2)
SQL*Plusでは、";"は文を実行するという意味があるのでXQueryのPrologで入力してしまうとそこまで入力したXQueryを解析、実行してしまうので要注意!

SQL*PLusでXqueryを入力する際のちょっとしたテクニックとして、一旦前述のように入力後SQL*Plusのeditコマンドでviなどを起動し編集すればこの問題は回避できる。以下はeditコマンドを利用してviで入力した。

SCOTT> edit
file afiedt.bufが書き込まれました。

1 (: サンプル :)
2 xquery version "1.0" encoding "utf-8";
3 declare namespace mo = "http://192.168.1.20/my_namespace";
4 declare function mo:phoneNumber($phone)
5 {
6 $phone/text()
7 };
8 (: Query Body :)
9 <result>
10 {
11 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
12 return
13 <greeting>
14 { fn:concat( "Hello, ", mo:phoneNumber($i)) }
15 </greeting>
16 }
17* </result>
18 /
SP2-0552: バインド変数"CONCAT"が宣言されていません。

やはり、XQueryのコメント(::)から開始するとSQL文だと判断されてしまうようだ。


XQueryコマンドの前にあるXQueryのコメントを削除する。XQueryとしては正しいのだが、SQL*Plusでは別のエラーが発生する。
以下のエラーメッセージから version "1.0" の部分が文法エラーとされてしまっている。恐らくencodeingも文法エラー扱いになるだろう。

SCOTT> edit
file afiedt.bufが書き込まれました。

1 xquery version "1.0" encoding "utf-8";
2 declare namespace mo = "http://192.168.1.20/my_namespace";
3 declare function mo:phoneNumber($phone)
4 {
5 $phone/text()
6 };
7 (: Query Body :)
8 <result>
9 {
10 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
11 return
12 <greeting>
13 { fn:concat( "Hello, ",mo:phoneNumber($i)) }
14 </greeting>
15 }
16* </result>
SCOTT> /
ERROR:
ORA-19114: XPST0003 - XQuery式を解析中にエラーが発生しました: LPX-00801:
XQuery syntax error at '"1.0"'
1 version "1.0" encoding "utf-8";
- ^

ということで、versionとencodingを削除してみると、わ〜〜、パチパチ。上手くできました。
XQueryの文法では正しくてもSQL*PlusやOracle11gの実装により文法エラーとされてしまうケースもあるので、Oracle11gでXMLマスタープロフェッショナル(DB)の勉強をする際には要注意。

SCOTT> edit
file afiedt.bufが書き込まれました。

1 xquery
2 declare namespace mo = "http://192.168.1.20/my_namespace";
3 declare function mo:phoneNumber($phone)
4 {
5 $phone/text()
6 };
7 (: Query Body :)
8 <result>
9 {
10 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
11 return
12 <greeting>
13 { fn:concat("Hello, ",mo:phoneNumber($i)) }
14 </greeting>
15 }
16* </result>
SCOTT> /

Result Sequence
--------------------------------------------------------------------------------
<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>





Ang?lique Kidjo - Djin Djin - Gimme Shelter

話はがらりと変わり、昨日はAngelique Kidjoライブご招待へ当選したので、ウチのおチビちゃんのお守りは奥さんに任せてdrmarさんをとブルーノート東京へ(久々だな〜)

曲目全ては覚えていないのだが、

Gimme Shelterをはじめ (アルバムでは、Joss Stone Joss Stone - Introducing Joss Stone
をフィーチャーしている)アルバム Djin Djinからの曲。私もdrmarさん同様、全く知らなかったアーティストなのだが、グラミー賞には過去5回ノミネートされたことがある実力派。西アフリカはペナン共和国出身。その影響だろうか、日本はもう冬なのだが、曲は太陽を感じるような曲が多い。

アルバム Djin Djinでは、ビーター・ガブリエル、カルロス・サンタナ、ジョス・ストーンなど多彩なゲストをフィーチャーしている。

YouTube - Gimme Shelter(Feat. Joss Stone)
YouTube - Africa Calling
YouTube - Voodoo Child
YouTube - Tumba


Angelique_kidjo

| |

トラックバック


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

コメント

コメントを書く