PLSQL解析XML類型字段


xmltype:

       Oracle9i 支持一種新的系統定義數據類型,名為XMLType。XMLType提供了多種內建的成員函數,為創建、提取和索引存儲在Oracle9i中的XML數據 提供了一種強有力的機制。作為一種新的數據類型,XMLType可用作表格和視圖中的各個列的數據類型,並可在PL/SQL存儲過程中作為參數、返回值和 變量使用。

      利用XMLType和這些功能,SQL開發者既可利用關系型數據庫的強大能力,也可在XML的環境下工作。與此類似,XML開發者一方面可利用XML標准的強大能力,另一方面又能在關系型數據庫的環境下工作。


1.建立含有xmltype數據類型的表
createtable abc (id number,xmldoc sys.xmltype);
聲明xmltype型字段用:sys.xmltype

2.向帶有xmltype類型的表插入帶有數據
insertinto abc (id,xmldoc) value (abc.nextval , sys.xmlType.createXML('<name><aid="1" value="some values">abc</a></name>'));
插入用 sys.xmlType.createXML('some xml doc')

3.直接查詢xmltype字段里面的內容
得到id=1的value變臉的值
selecti.xmldoc.extract('//name/a[@id=1]/@value').getStringVal() as ennames, id from abc i


得到a節點的值
selectid, i.xmldoc.extract('//name/a/text()').getStringVal() as truename from abc i

得到節點id屬性的值

Select hd.Data_t.extract('/root/name/@id').getStringVal()    As Name FROM sehr_house_data hd


4.更新xmltype里面的數據
updateabc set xmldoc=updateXML(xmldoc,'//name/a[@id=1]/@value','some new value')where ......
(注意:如果里面沒有<aid="1">這個節點,將不能update)

5.添加超過4k字節的xml文檔到xmltype型字段
可以通過使用臨時表的辦法實現:
先建立一個臨時的表,其中的一個字段是clob類型;
再將要寫入xmltype字段的xml doc寫入這個臨時的clob型的字段中;
最后insertinto abc (id,xmldoc) values (abc_q.nextval , sys.xmlType.createXML((select contentfrom 臨時表whereid=......)));


existsNode

       EXISTSNODE函數檢查XML中的某一個節點是否存在。如果存在,返回1,否則返回0。  

select existsNode(value(a),'Corporation/Name')

   from table(xmlsequence(extract(v_xml,'Root/Corporation')))a;

select count(*)

   from table(xmlsequence(extract(v_xml,'Root/Corporation')))a

where existsNode(xmlvalue,'Corporation/Name[@id=1]') =1;


extractValue

       EXTRACTVALUE()是從某個節點中讀取值。ExtractValue只能返回一個確切的位置節點的值,如果存在多個相同節點,Oracle就會報錯 。

select extractValue(value(a),'Corporation/Name')cor_nam

   from table(xmlsequence(extract(v_xml,'Root/Corporation')))a;


extract

       EXTRACT函數返回一個XML文檔的一個節點樹,或者某一節點下所有符合條件的節點。


  select extract(value(a),'Corporation/Persons/Person')cor_person

    from table(xmlsequence(extract(v_xml,'Root/Corporation')))a;


Xmlsequence、table

      利用xmlsequence()和table()返回符合條件的節點的值 。

selectextract(value(a),'Corporation/Persons/Person') cor_person

    from table(xmlsequence(extract(v_xml,'Root/Corporation')))a;


實例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM