2008年7月31日 星期四

XMLTable transform xml data to structured data using Oracle10g


/*
  XML型態的資料可借XMLTable轉換成像實體Table一樣的結構
*/


-- 利用之前存到AREA 這個XML型態的資料

SQL> select * from area;

SYS_NC_ROWINFO$
-------------------------------------------------------------------------------------
< ?xml version="1.0" encoding="BIG5"? >
< ROWSET >
 < THISROW >
  < AREAID >1< /AREAID>
  < AREA_ENAME >Africa< /AREA_ENAME>
  < AREA_CNAME >非洲< /AREA_CNAME>
 < /THISROW >
 < THISROW >
  < AREAID >2< /AREAID >
  < AREA_ENAME >America< /AREA_ENAME >
  < AREA_CNAME >美洲< /AREA_CNAME >
 < /THISROW >
 < THISROW >
  < AREAID >3< /AREAID >
  < AREA_ENAME >Asia< /AREA_ENAME >
  < AREA_CNAME >亞洲< /AREA_CNAME >
 < /THISROW >
 < THISROW >
  < AREAID >4< /AREAID >
  < AREA_ENAME >Europe< /AREA_ENAME >
  < AREA_CNAME >歐洲< /AREA_CNAME >
 < /THISROW >
 < THISROW >
  < AREAID >5< /AREAID >
  < AREA_ENAME >Middle East< /AREA_ENAME >
  < AREA_CNAME >中東< /AREA_CNAME >
 < /THISROW >
 < THISROW >
  < AREAID >6< /AREAID >
  < AREA_ENAME >Oceania< /AREA_ENAME >
  < AREA_CNAME >大洋洲< /AREA_CNAME >
 < /THISROW >
< /ROWSET >


-- 運用XMLTable的語法如下:
-- 先存成 xml2structure.sql


select area2.ID,area2.AREA_ENAME,area2.AREA_CNAME
from  area,
    xmltable('for $i in /ROWSET/THISROW
          return $i'
    PASSING OBJECT_VALUE
    COLUMNS ID      VARCHAR(2) PATH 'AREAID',
         AREA_ENAME VARCHAR2(32) PATH 'AREA_ENAME',
         AREA_CNAME VARCHAR2(32) PATH 'AREA_CNAME'
) area2
/

-- 執行 xml2structure.sql

SQL> column id format a2
SQL> column area_ename format a20
SQL> column area_cname format a20

SQL> @c:\xml2structure.sql;

ID AREA_ENAME       AREA_CNAME
-- -------------------- --------------------
1  Africa         非洲
2  America        美洲
3  Asia          亞洲
4  Europe         歐洲
5  Middle East      中東
6  Oceania        大洋洲

已選取 6 個資料列.