前幾天一直在做Oracle對XMLType字段的操作,我還不是Oracle大拿,到網上找了很多資料,但是很多就是單一功能的介紹,不能很好的解決問題,現在在這里總結下。
1、下面先創建一個名未test.xml的配置文件。
<?xml version="1.0" encoding="UTF-8" ?>
<collection xmlns="">
<record>
<leader>-----nam0-22-----^^^450-</leader>
<datafield tag="200" ind1="1" ind2=" ">
<subfield code="a">抗震救災</subfield>
<subfield code="f">奧運會</subfield>
</datafield>
<datafield tag="209" ind1=" " ind2=" ">
<subfield code="a">經濟學</subfield>
<subfield code="b">計算機</subfield>
<subfield code="c">10001</subfield>
<subfield code="d">2005-07-09</subfield>
</datafield>
<datafield tag="610" ind1="0" ind2=" ">
<subfield code="a">計算機</subfield>
<subfield code="a">筆記本</subfield>
</datafield>
</record>
</collection>
2、在Oracle中創建一個存放該XML文件的表:
create or replace table xmlexample(
ID varchar2(10),
name varchar2(20),
data xmltype
)
insert into xmlexample(id,name,data)
values(sys_guid(),'my document',
xmltype
(
bfilename(filepath,filename),
nls_charset_id('AL32UTF8')
)
)
其中filepath為文件路徑,filename為文件名。
3、extractvalue()函數的使用
Oracle提供對XML文件的檢索功能(extractvalue),extractvalue只能返回一個節點的一個值,具體操作方法如下:
SQL> select id,name,
2 extractvalue(x.data,'/collection/record/leader') as A
3 from xmlexample x;
ID NAME A
---------- -------------------- ----------------------------------
1 my document -----nam0-22-----^^^450-
如果該節點有兩個值,則系統提示錯誤。
4、extract()函數的使用
如果想查詢所有subfield的值就要用到extract(),它可以返回一個節點下的所有值。操作如下
SQL> select id,name,
2 extract(x.data,'/collection/record/datafield/subfield') as A
3 from xmlexample x;
ID NAME A
---------- -------------------- ---------------------------------------------------------
1 my document <subfield xmlns="" code="a">抗震救災</subfield><subfield xmlns="" code="f">何觀.....
可以看到它返回的是XML格式的。如果我們想只返回它值就要是用兩個函數了。
5、table和XMLSequence
操作如下:
SQL> select extractValue(value(i),'/subfield') xx
2 from xmlexample x,
3 table(XMLSequence(extract(x.data,'/collection/record/datafield/subfield'))) i;
XX
--------------------------------------------------------------------------------
抗震救災
何觀華
經濟學
計算機
10001
2005-07-09
計算幾 哈哈
7 rows selected。
6、檢索出特定的節點的特定值
有時候我們在實際操作的時候並不是檢索出所有值,而是根據條件查詢出我們所需要的信息。如果我們想檢索出
<datafield tag="209" ind1=" " ind2=" ">
<subfield code="a">經濟學</subfield>
中的值-經濟學
操作如下:
SQL> select id,name,
2 extractvalue(x.data,'/collection/record/datafield[@tag="209"]/subfield[@code="a"]') as A
3 from xmlexample x;
ID NAME A
---------- -------------------- ---------------------------
1 my document 經濟學
7、總結
Oracle對與XMLType的操作有很多種,還要靠大家自己去發現。數據庫對XML的檢索就是吧XML的節點當作一個列來檢索,而不同的是表里裝的是二維的數據,而XML中可以裝N維。還有就是,表中列不存在就會提示無效標識符,如果節點不存在,則檢索出NULL,不會報錯。所以,對與XML文件的操作通常是通過試圖來完成。