2008年7月24日 星期四

Oracle XML DB (II) using Oracle10g


/*
  現在就是要將XML(.xml及.xsd)放到XML DB的repository去.
  會用到DBMS_XDB及DBMS_XMLSCHEMA這兩個Package
*/

-- 檢查一下我的port number有沒有設定

SQL> SELECT dbms_xdb.gethttpport FROM dual;

GETHTTPPORT
-----------
0

-- 設定為8080

SQL> EXEC dbms_xdb.sethttpport(8080);

PL/SQL procedure successfully completed.

-- Listener叫起來

C:\>lsnrctl start

-- browser 輸入網址http://localhost:8080/
--之前已經使用DBMS_XDB.CREATEFOLDER去建立我自己希望在repository裡所呈現的路徑


/* 大致上是這樣
  public 
   └ orion
      ├ xml
      └ xsd
*/


/*
 ※ 加進去的檔案名稱是有區分大小寫的
 ex:
  /public/orion/xml/Area.xml和
  /public/orion/xml/area.xml是會被認為兩個完全不一樣的檔案
*/


--先加入xsd

SQL> declare
 2 res boolean;
 3 begin
 4 res:=dbms_xdb.createresource('/public/orion/xsd/area.xsd',getdocument('area.xsd'));
 5 end;
 6 /

已順利完成 PL/SQL 程序.

--加進來後,area.xsd出現在browser裡



--註冊xsd前須要權限上的異動
--以dba身份登入


SQL>connect / as sysdba
已連線.
SQL>grant alter session to orion;
順利授權.

--換回原來的USER後,接著去註冊xsd

SQL> begin
 2 dbms_xmlschema.registerschema('http://localhost:8080/public/orion/xsd/area.xsd',getDocument('area.xsd'));
 3 end;
 4 /

已順利完成 PL/SQL 程序.

--註冊後,area.xsd出現在sys/schema下


--這時候在user_objects裡就已經看得到AREA了


SQL> select object_name,object_type from user_objects
 2 where object_name like '%AREA%';

OBJECT_NAME    OBJECT_TYPE
---------------- -------------------------------------------------------------
AREA        TABLE
AREA$xd      TRIGGER
AREA_OT      TYPE
AREA_ROW_NTT   TYPE
AREA_ROW_OT    TYPE


--加入xml

SQL> declare
 2 res boolean;
 3 begin
 4 res:=dbms_xdb.createresource('/public/orion/xml/area.xml',getDocument('area.xml'));
 5 end;
 6 /

已順利完成 PL/SQL 程序.

--加進來後,area.xml出現在browser裡


--看一下AREA的變化

SQL> select count(*) from area;
  COUNT(*)
 ----------
      1

--對AREA做XML的QUERY

SQL> select extractvalue(xseq.column_value,'/THISROW/AREAID') as AREAID,
 2 extractvalue(xseq.column_value,'/THISROW/AREA_ENAME') as AREA_ENAME,
 3 extractvalue(xseq.column_value,'/THISROW/AREA_CNAME') as AREA_CNAME
 4 from AREA d,TABLE(XMLSEQUENCE(EXTRACT(VALUE(d),'/ROWSET/THISROW'))) xseq;

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

已選取 6 個資料列.


-- 測試一下是否可以下條件

SQL> select extractvalue(xseq.column_value,'/THISROW/AREA_CNAME')
 2 from AREA d,TABLE(XMLSEQUENCE(EXTRACT(VALUE(d),'/ROWSET/THISROW'))) xseq
 3 where extractvalue(xseq.column_value,'/THISROW/AREAID') = 5;

EXTRACTVALUE(XSEQ.COLUMN_VALUE,'/THISROW/AREA_CNAME')
-----------------------------------------------------
中東


-- 未完,因為還有許多不了解的