Oracle中對XMLType的簡單操作(extract、extractvalue))

來源:互聯網
上載者:User

轉自:http://hi.baidu.com/wuxg/blog/item/d9c8e750426bc7491038c2c2.html

 

Oracle中對XMLType的簡單操作(extract、extractvalue)2011-03-15 16:53

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.