前幾天一直在做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檔案的操作通常是通過試圖來完成。 |