/*
現在就是要將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')
-----------------------------------------------------
中東
-- 未完,因為還有許多不了解的