<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一葉笑天
    雄關(guān)漫道真如鐵, 而今邁步從頭越。 從頭越, 蒼山如海, 殘陽如血。
    posts - 73,comments - 7,trackbacks - 0

    原文出處:http://www.hellodba.com/Doc/oracle_xml_db.htm
    Oracle XML DB之淺入淺出

    作者:fuyuncat

    來源:WWW.HelloDBA.COM

    備注:XML DBOracle 9.2中出現(xiàn)的新特性。

    1         XML DB安裝

    通過DBCA安裝

    2         XML DB數(shù)據(jù)處理

    2.1    存儲(chǔ)XML數(shù)據(jù)到XML表中

    2.1.1創(chuàng)建一個(gè)有XMLType類型字段的表:

    create table xmlcontent (keyvalue varchar2(10) primary key,

                                           xmlvalue xmltype);

    2.1.2創(chuàng)建一個(gè)XMLType類型表

    create table xmltable of xmltype;

    2.1.3XML文件中讀取數(shù)據(jù)存儲(chǔ)到XML表中

    創(chuàng)建Directory指向存放XML文件的路徑:

    SQL> grant create any directory to xdb;

    Grant succeeded.

    SQL> conn xdb/xdb

    Connected.

    SQL> create directory XMLDIR as 'C:"oracle"XMLDB';

    Directory created.

    創(chuàng)建存儲(chǔ)過程,從XML文件中讀取數(shù)據(jù)存儲(chǔ)到XML表中

    create or replace function getClobDocument(

       filename in varchar2,

       charset in varchar2 default NULL)

     return CLOB deterministic

     is

        file            bfile := bfilename(‘XMLDIR’,filename);

        charContent     CLOB := ' ';

        targetFile      bfile;

        lang_ctx        number := DBMS_LOB.default_lang_ctx;

        charset_id      number := 0;

        src_offset      number := 1 ;

        dst_offset      number := 1 ;

        warning         number;

     begin

       if charset is not null then

           charset_id := NLS_CHARSET_ID(charset);

       end if;

       targetFile := file;

       DBMS_LOB.fileopen(targetFile, DBMS_LOB.file_readonly);

       DBMS_LOB.LOADCLOBFROMFILE(charContent, targetFile,

               DBMS_LOB.getLength(targetFile), src_offset, dst_offset,

               charset_id, lang_ctx,warning);

       DBMS_LOB.fileclose(targetFile);

       return charContent;

     end;

     /

    -- you can use getCLOBDocument() to generate a CLOB from a file containin

    -- an XML document. For example, the following statement inserts a row into the

    -- XMLType table Example2 created earlier:

    向表中插入數(shù)據(jù):

    SQL> INSERT INTO XMLTABLE

      2  VALUES(XMLTYPE(getCLOBDocument('init.xml')));

    1 row created.

    SQL> INSERT INTO XMLContent

      2  VALUES(1, XMLTYPE(getCLOBDocument('init.xml', 'UTF8')));

    1 row created.

    SQL> commit;

    Commit complete.

    2.2    更新XML表數(shù)據(jù)

    2.2.1普通Update方式

    SQL> UPDATE XMLTABLE X SET VALUE(X)=XMLTYPE(getCLOBDocument('init.xml'));

    1 row updated.

    SQL> UPDATE XMLContent SET xmlvalue=XMLTYPE(getCLOBDocument('init.xml'))

      2  WHERE keyvalue='1';

    1 row updated.

    SQL> commit;

    Commit complete.

    2.2.2使用updatexml()更新節(jié)點(diǎn)值

    SQL> UPDATE xmlcontent

      2      SET xmlvalue = updateXML(xmlvalue,

      3                             '/sqlstress/config/userName/text()',

      4                             'shanxi')

      5      WHERE existsNode(xmlvalue,

      6         '/sqlstress/config[userName="shanxi806"]') = 1;

    1 row updated.

    SQL> commit;

    Commit complete.

    SQL> select extractvalue(xmlvalue,'/sqlstress/config/userName')

      2  from xmlcontent;

    EXTRACTVALUE(XMLVALUE,'/SQLSTRESS/CONFIG/USERNAME')

    ---------------------------------------------------------------------

    shanxi

    2.2.3使用updatexml()更新一個(gè)節(jié)點(diǎn)樹

    SQL> UPDATE xmlcontent

      2    SET xmlvalue =

      3    updateXML(xmlvalue,

      4              '/sqlstress/functions/function[1]/parameters/prameter[2]/valuecope',

      5              xmltype('<valueScope rangeType="RANGE" dataType="int">

      6                          <minValue>

      7                              13111111111

      8                          </minValue>

      9                          <maxValue>

     10                              13999999999

     11                          </maxValue>

     12                      </valueScope>'

     13               )

     14    )

     15    WHERE existsNode(xmlvalue,

     16          '/sqlstress/functions/function[1]/parameters/parameter[@pid=2]'

     17    ) = 1;

    1 row updated.

    2.3    XML表中讀取數(shù)據(jù)

    主要利用extract(), extractValue(), and existsNode()等幾個(gè)函數(shù)。”Init.xml”的內(nèi)容參見附錄。

    2.3.1existsNode ()

    EXISTSNODE函數(shù)檢查XML中的某一個(gè)節(jié)點(diǎn)是否存在。如果存在,返回1,否則返回0

    SQL> SELECT existsNode(value(X),'/sqlstress/config/connURL')

      2     FROM XMLTABLE X;

    EXISTSNODE(VALUE(X),'/SQLSTRESS/CONFIG/CONNURL')

    ------------------------------------------------

                                                   1

    SQL> SELECT existsNode(value(X),'/sqlstress/config/connURLFalse')

      2     FROM XMLTABLE X;

    EXISTSNODE(VALUE(X),'/SQLSTRESS/CONFIG/CONNURLFALSE')

    -----------------------------------------------------

                                                        0

    SQL> SELECT existsNode(xmlvalue,'/sqlstress/config/connURL')

      2    FROM XMLContent X

      3   WHERE keyvalue = '1';

    EXISTSNODE(XMLVALUE,'/SQLSTRESS/CONFIG/CONNURL')

    ------------------------------------------------

                                                   1

    SQL> SELECT existsNode(value(X),

      2         '/sqlstress/config[userPWD="'||chr(10)||'            shanxi806'||chr(10)||'        "'||']')

      3     FROM XMLTABLE X;

    EXISTSNODE(VALUE(X),'/SQLSTRESS/CONFIG[USERPWD="'||CHR(10)||'SHANXI806'||CHR(10)

    --------------------------------------------------------------------------------

                                                                                   1

    SQL> SELECT count(*)

      2    FROM XMLContent x

      3   WHERE existsNode(xmlvalue,'/sqlstress/config[userName="shanxi806"]') = 1;

      COUNT(*)

    ----------

             1

    SQL> SELECT count(*)

      2    FROM XMLContent x

      3   WHERE existsNode(xmlvalue,'/sqlstress/functions/function[@id=1]') = 1;

      COUNT(*)

    ----------

             1

    SQL> SELECT count(*)

      2    FROM XMLContent x

      3   WHERE existsNode(xmlvalue,'/sqlstress/functions/function/parameters/parameter[2][@pid=2]') = 1;

      COUNT(*)

    ----------

             1

    2.3.2extractValue()

    EXTRACTVALUE()是從某個(gè)節(jié)點(diǎn)中讀取值

    SQL> select extractValue(xmlvalue, '/sqlstress/config/userPWD')

      2  from xmlcontent

      3  where keyvalue='1';

    EXTRACTVALUE(XMLVALUE,'/SQLSTRESS/CONFIG/USERPWD')

    ----------------------------------------------------------------

                shanxi806

    SQL> SELECT extractvalue(xmlvalue, '/sqlstress/functions/function[1]/parameters/parameter[2]/@pid')

      2    FROM xmlcontent

      3   WHERE keyvalue = '1';

    EXTRACTVALUE(XMLVALUE,'/SQLSTRESS/FUNCTIONS/FUNCTION[1]/PARAMETERS/PARAMETER[2]/

    --------------------------------------------------------------------------------

    2

    ExtractValue只能返回一個(gè)確切的位置節(jié)點(diǎn)的值,如果存在多個(gè)相同節(jié)點(diǎn),Oracle就會(huì)報(bào)錯(cuò):

    SQL> SELECT extractvalue(xmlvalue, '/sqlstress/functions/function[1]/parameters/

    parameter')

      2    FROM xmlcontent

      3   WHERE keyvalue = '1';

      FROM xmlcontent

           *

    ERROR at line 2:

    ORA-19025: EXTRACTVALUE returns value of only one node

    SQL> SELECT extractvalue(xmlvalue, '/sqlstress/config')

      2    FROM xmlcontent

      3   WHERE keyvalue = '1';

      FROM xmlcontent

           *

    ERROR at line 2:

    ORA-19025: EXTRACTVALUE returns value of only one node

    2.3.3Extract()

    EXTRACT函數(shù)返回一個(gè)XML文檔的一個(gè)節(jié)點(diǎn)樹,或者某一節(jié)點(diǎn)下所有符合條件的節(jié)點(diǎn)。

    返回一個(gè)節(jié)點(diǎn)樹:

    SQL> set line 100

    SQL> set lone 20000

    SQL> SELECT extract(xmlvalue, '/sqlstress/config')

      2    FROM xmlcontent

      3   WHERE keyvalue = '1';

    EXTRACT(XMLVALUE,'/SQLSTRESS/CONFIG')

    -----------------------------------------------------

    <config>

      <connURL>

                jdbc:oracle:thin:@10.71.111.231:1521:P51

            </connURL>

      <userName>shanxi806</userName>

      <userPWD>

                shanxi806

            </userPWD>

      <threadNum>

                100

            </threadNum>

      <execNumPerThread>

                1000

            </execNumPerThread>

    </config>

    返回所有符合條件的節(jié)點(diǎn):

    SQL> SELECT extract(xmlvalue, '/sqlstress/functions/function[1]/parameters/parameter/paraType')

      2    FROM xmlcontent

      3   WHERE keyvalue = '1';

    EXTRACT(XMLVALUE,'/SQLSTRESS/FUNCTIONS/FUNCTION[1]/PARAMETERS/PARAMETER/PARATYPE')

    --------------------------------------------------------------------------------

    <paraType>

                            String

                        </paraType>

    <paraType>

                            String

                        </paraType>

    <paraType>

                            int

                        </paraType>

    <paraType>

                            String

                        </paraType>

    <paraType>

                            String

                        </paraType>

    <paraType>

                            float

                        </paraType>

    <paraType>

                            int

                        </paraType>

    2.3.4利用xmlsequence()table()返回符合條件的節(jié)點(diǎn)的值:

    SQL> SELECT extractValue(value(t),'/paraType')

      2    FROM XMLContent,

      3      TABLE( xmlsequence (

      4                extract(xmlvalue,

      5                        '/sqlstress/functions/function[1]/parameters/parameter/paraType'))

      6             ) t

      7   WHERE keyvalue='1';

    EXTRACTVALUE(VALUE(T),'/PARATYPE')

    --------------------------------------------------------------------------------

                            String

                            String

                            int

                            String

                            String

                            float

                            int

    2.4    XML的格式處理

    2.4.1利用transform()函數(shù)將XSLT應(yīng)用到XML

    SQL> update xmltable x set value(x)=XMLTYPE(getclobdocument('example.xml'));

    1 row updated.

    SQL> commit;

    Commit complete.

    SQL> SELECT value(t).transform(xmltype(getclobdocument('example.xsl')))

      2      from XMLTABLE t

      3      where existsNode(value(t),

      4                       '/PurchaseOrder[Reference="ADAMS-20011127121040988PST"]'

      5      ) = 1;

    2.4.2利用XMLTransform()函數(shù)進(jìn)行格式處理

    SQL> select xmltransform(value(t), xmltype(getclobdocument('example.xsl')))
    2        from XMLTABLE t;

    2.5    其他XMLType方法

    CREATEXML () :一個(gè)用來創(chuàng)建XMLType實(shí)例的靜態(tài)方法。

    ISFRAGMENT():如果XMLType包含一個(gè)文檔段則返回1。文檔段的意思就是一個(gè)沒有根節(jié)點(diǎn)的XML穩(wěn)當(dāng)。文檔段一般可以通過Extract()函數(shù)產(chǎn)生。

    GETCLOBVAL():返回一個(gè)CLOB,它包含的內(nèi)容是基于CMLType內(nèi)容的XML文檔。

    GETROOTELEMENT():返回XMLTypeXML文檔的根元素的名稱。

    GETNAMESPACE():返回XMLTypeXML文檔的根元素的名稱。

    3         XML存儲(chǔ)

    3.1    結(jié)構(gòu)化存儲(chǔ)還是非結(jié)構(gòu)化存儲(chǔ)

    關(guān)于結(jié)構(gòu)化存儲(chǔ)和非結(jié)構(gòu)化存儲(chǔ)的對比:

    特性

    非結(jié)構(gòu)化XML存儲(chǔ)

    結(jié)構(gòu)化XML存儲(chǔ)

    存儲(chǔ)技術(shù)

    XMLType的字段和表的內(nèi)容都是通過CLOB類型存儲(chǔ)

    XMLType的字段和表的內(nèi)容都是存為SQL對象的集合。默認(rèn)情況下,基于schemaXMLType的字段和表的XML模型都是結(jié)構(gòu)化的存儲(chǔ)方式

    是否可以存儲(chǔ)非XML的基于schema的表

    只有當(dāng)XMLType的字段和表與XML schema無關(guān)時(shí)可以

    只有當(dāng)XMLType的字段和表是基于XML Schema時(shí)才可以。

    性能:存儲(chǔ)和獲取速度

    因?yàn)樵诖嫒〔僮鲿r(shí),不需要解析和重編譯,可以獲得很高的存取速度。

    在存取時(shí)較慢。因?yàn)樵诖鎯?chǔ)時(shí)需要將文檔切割,而在提取之前需要重新構(gòu)造。

    性能:操作速度

    比結(jié)構(gòu)化存儲(chǔ)方式更慢

    較快

    靈活性:是否能很容易被處理

    具有較強(qiáng)的靈活性

    Oracle 9i的面向?qū)ο筇匦猿煞幢?/span>

    內(nèi)存使用情況:XML文檔是否需要被解析

    Oracle XML DB需要解析整個(gè)文檔到內(nèi)存中

    可以使用Oracle XML DB減少內(nèi)存的使用,并通過以下方式優(yōu)化對XMLType的字段和表基于DOM的操作:

    Lazy Manifestation (LM)

    Least Recently Used (LRU)

    posted on 2008-07-30 15:58 一葉笑天 閱讀(1757) 評論(0)  編輯  收藏 所屬分類: 個(gè)人轉(zhuǎn)貼
    主站蜘蛛池模板: 黄色视频在线免费观看| www.亚洲精品| 亚洲精品蜜桃久久久久久| 在线观看AV片永久免费| 少妇人妻偷人精品免费视频| 高清免费久久午夜精品| 亚洲综合无码一区二区痴汉 | 亚洲中文字幕无码久久2020| 亚洲国产日韩一区高清在线| 亚洲人成网7777777国产| 又爽又高潮的BB视频免费看| 成年女人午夜毛片免费看| 亚洲AV无码一区二区三区电影| 又黄又爽无遮挡免费视频| 欧洲精品成人免费视频在线观看| 高潮毛片无遮挡高清免费视频| 久久精品国产亚洲一区二区| 亚洲国产婷婷综合在线精品 | 亚洲精品国精品久久99热| 在线看片无码永久免费aⅴ| 久久天天躁狠狠躁夜夜免费观看| 亚洲香蕉免费有线视频| 久久aa毛片免费播放嗯啊| 国精产品一区一区三区免费视频 | 国产亚洲情侣一区二区无| 亚洲精品无码久久久| 亚洲精品老司机在线观看| 吃奶摸下高潮60分钟免费视频| 国产一级做a爱免费视频| 日韩精品免费电影| 卡一卡二卡三在线入口免费| 免费成人在线视频观看| 久章草在线精品视频免费观看| 人妻免费一区二区三区最新| 久久免费区一区二区三波多野| 免费人成黄页在线观看日本| 99re在线这里只有精品免费| 无忧传媒视频免费观看入口| 污视频网站免费在线观看| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲日韩在线观看免费视频|