XML DB の なんでやねん!!

え〜先日より続いておりますXMLデータベースのなんでやねん!のお時間がやってまいりました。
(いつからだ?)

今日の困ったことは2点…
XMLDBのインサートにて怒られる。
・Select文で何が何でもNULLが返ってくる。

それでは詳細な現象および解決方法をごらんください。

以前にも記載している、「データベース技術者のためのXML入門(第3回)」
に基きまして、XML Schema の登録をして、Insert文の確認をしたいので、 
XML文書は

Insert empInfo_XML values (XMLType('
<?xml version="1.0" encoding="Shift_JIS"?>
<emp:empInfo xmlns:emp="http://otnxml.oracle.co.jp/empInfo.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://otnxml.oracle.co.jp/empInfo.xsd empInfo.xsd">

</emp:empInfo>
'))

のように実行してみた。

そしたらOracleDB君から

SQL実行中に以下のエラーが発生しました。
ORA-31011: XML解析に失敗しました
ORA-19202: XML処理
LPX-00209: XMLで始まるPI名は予約されています。
Error at line 3
中にエラーが発生しました
ORA-06512: "SYS.XMLTYPE", 行301
ORA-06512: 行1

とお叱りを受けるしまつ…

なんでだぁ!!と思いつつ解決策は簡単だったんですよ…
でもそれに気づくのに時間を費やしましたけど…(ーー;)
解決方法は

Insert empInfo_XML values (XMLType('
<?xml version="1.0" encoding="Shift_JIS"?>
              ↓
Insert empInfo_XML values (XMLType('<?xml version="1.0" encoding="Shift_JIS"?>

はい、これだけなんですよ。だからサンプルなんかもシングルフォーテンションの後ろに
XML宣言部分が記載されていたのかぁ…と思いつつもなんとなく納得いかない状態<(_ _)>

とりあえずデータも入ったことだし、属性の値の取得ってしてなかったから、
社員IDでも抽出してみるかと次のSQL実行したら…ハイNULLが返ってきます。

SELECT
extractvalue(object_value, '/empInfo/employee/@id')
FROM
empInfo_XML

そこで

SELECT
extractvalue(object_value, '/empInfo/employee/personalInfo/name')
FROM
empInfo_XML

であればちゃんと値が取得できることは確認完了…。
で属性の時にだけNULLが返ってくるのは納得いなずとも、値をとる為にいろいろしたところ
これも判ってしまえば簡単…

SELECT
extractvalue(object_value, '/emp:empInfo/emp:employee/@emp:id',
                'xmlns:emp="http://otnxml.oracle.co.jp/empInfo.xsd"'),
FROM
empInfo_XML

名前空間をちゃんと指定してあげる事。
いやはや、それも判りますが…なんで要素はOKで属性はダメなんや?

なにはともあれこれで欲しい値は取得はできた。

なんかほんとXMLの仕様を多少なりとも知らないと余計にきついんだろうなぁ…