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の仕様を多少なりとも知らないと余計にきついんだろうなぁ…