XML在Oracle数据库中的应用.docx

上传人:b****7 文档编号:10407955 上传时间:2023-02-11 格式:DOCX 页数:38 大小:71.93KB
下载 相关 举报
XML在Oracle数据库中的应用.docx_第1页
第1页 / 共38页
XML在Oracle数据库中的应用.docx_第2页
第2页 / 共38页
XML在Oracle数据库中的应用.docx_第3页
第3页 / 共38页
XML在Oracle数据库中的应用.docx_第4页
第4页 / 共38页
XML在Oracle数据库中的应用.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

XML在Oracle数据库中的应用.docx

《XML在Oracle数据库中的应用.docx》由会员分享,可在线阅读,更多相关《XML在Oracle数据库中的应用.docx(38页珍藏版)》请在冰豆网上搜索。

XML在Oracle数据库中的应用.docx

XML在Oracle数据库中的应用

 

XML在Oracle数据库中的应用

 

2007年10月20日

目录

第1章Oracle数据库对XML的支持3

1.1.支持XML的数据库版本3

1.2.什么时候需要XDB数据库属性3

1.3.哪些版本支持XQuery4

第2章在Oracle中如何存储XML数据4

2.1.以关系型存储XML数据(结构化的存储)4

2.2.以XMLTYPE的方式存储6

2.2.1.非结构化存储6

2.2.2.结构化存储11

Oracle数据库对XML的支持

并不是所有的Oracle数据库版本都支持XML的存储以及操作,这里列出了Oracle数据库对XML的支持功能

支持XML的数据库版本

Oracle最开始提供XDB性质是在Oracle9.2.0.1这个数据库版本,但是直到9.2.0.3版本才最低限度的提供了XDB托管的级别。

查询安装好的数据库是否已经具备了XDB的性质,需要查询Oracle的字典表:

DBA_REGISTRY,例如:

代码1-1查询当前数据库的安装组件

SELECT*FROMDBA_REGISTRY;

运行的结果如下:

图1-1查询DBA_REGISTRY字典的结果

只有在状态列STATUS的数值为VALID的情况下,XDB数据才是安装成功的。

什么时候需要XDB数据库属性

当在数据库的PROCEDURE、VIEW、FUNCTIONS、COLUMNS或者TABLES中使用了XMLTYPE这个属性,就会需要XDB数据库的来作支撑。

同样如果在数据库中使用了DBMS_XMLDOM、DBMS_XMLQUERY等系统包,也是需要有XDB的支持。

哪些版本支持XQuery

Oracle数据库中支持XQuery标准的最低版本是10.2.0.1。

在Oracle中如何存储XML数据

在Oracle数据库中存储XML的数据一共有两种方法:

数据还是以传统的关系型的存储在数据库中;

以XMLTYPE的方式存储在数据库表中;

以关系型存储XML数据(结构化的存储)

第一种方法是沿用Oracle的传统模式将数据以字符串的类型存储在数据库的varchar列中,调用函数来返回XML类型的数据,例如:

代码2-1使用传统关系型的存储方式存储数据

/*以HR.EMPLOYEES表格数据为案例*/

--对表格数据的扫描结果如下

SQL>settimingon

SQL>SELECTfirst_name||'.'||last_nameFROMHR.EMPLOYEES;

FIRST_NAME||'.'||LAST_NAME

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

Hermann.Baer

Shelley.Higgins

William.Gietz

……

Executedin0.08seconds

--使用XMLELEMENT函数来进行转换,选择结果10行以内的数据,运行结果如下

SQL>SELECTXMLElement("name",first_name||'.'||last_name)FROMhr.employeeswhererownum<10;

XMLElement("name",first_name||'.'||last_name)

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

Ellen.Abel

Mozhe.Atkinson

Hermann.Baer

Amit.Banda

Sarah.Bell

9rowsselected

Executedin8.212seconds

在对全表数据扫描时,还出现了如下错误尚未找到合理原因:

代码2-2使用Xmlement对表格数据进行全部扫描

SQL>selectcount(*)fromhr.employees;

COUNT(*)

----------

107

Executedin0.02seconds

SQL>SELECTXMLElement("name",first_name||'.'||last_name)FROMhr.employees;

XMLELEMENT("NAME",FIRST_NAME||

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

Ellen.Abel

Mozhe.Atkinson

Hermann.Baer

Amit.Banda

Sarah.Bell

……

……

SELECTXMLElement("name",first_name||'.'||last_name)FROMhr.employees

ORA-03114:

未连接到ORALCE

结论:

优点——

可以沿用传统的关系型数据库模式来存储,使用B树索引加快查询、修改、删除的速度;

便于查询、修改、存储的优化;

DML操作技术比较成熟,使用方便、易懂。

缺点——

使用XMLELEMENT转换的方法查询的结果是CLOB类型数据;

XML格式的文件需要从关系表中提取数据,重新组织成XML格式的文件,对系统开销比较大,查询速度远远慢于关系型数据库存储。

对于多数据量的转换(使用xmlelement转换)会造成数据库会话自动断开的现象。

以XMLTYPE的方式存储

XML数据通过Oracle新提供的XMLTYPE类型存储,大致分为三类存储模式:

●结构化存储

●非结构化存储

●混合存储

一般主要使用前面两种存储方式来存储操作XML类型的数据。

结构化存储

---以下引自Oracle官方网站。

结构化存储。

将结构化XML存储实现为一组对象。

这些对象可通过具有可以在表间实现的引用约束的表以关系格式实现。

它们也可以使用一个XMLSchema实现,以便将一个XMLType文档分解为一组对象。

在这里主要是使用了Oracle提供的XMLTYPE这个功能。

在使用关系表的情况中,可以因此对这些表进行预先设计,或者使用现有表。

该文档实际上通过关系表存储为“虚拟”文档,并保留其逻辑结构。

该方法可维护文档对象模型(DOM)保真度,但是它不是文档的逐字节物理表示。

这可以通过创建一个关于现有关系数据的XMLType视图来完成。

结构化存储比非结构化存储具有一些性能优势,选择它可通过表和索引设计提供更多的查询和更新优化。

结构化存储上的XML操作有助于减少内存和存储,因为没有存储XML标记,而且存在更细粒度的数据检索和使用。

基于b树和基于函数的索引使用得到了增强,而且使用XPath重写可在文档的部分上执行适当更新。

I/O操作速度对比

在这里主要是为了测试以结构化存储(使用XMLTYPE的方式)对数据插入的性能,其中测试一以及测试二主要对比将文本数据插入到数据库中表的性能:

带XMLTYPE类型字段的表和字符串列类型的表。

测试三主要针对以变量形式插入表的性能区别。

当前测试使用的机器配置如下:

表2-1当前测试机的物理配置

机型

操作系统

CPU

物理内存

虚拟内存

DELLGS52

Windows2000Profession

Intel(R)42.80HZ

1G

2.2G

当前数据库的SGA以及temporary的大小如下:

---SGA大小

SQL>select*fromv$sga;

NAMEVALUE

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

FixedSize1248600

VariableSize96469672

DatabaseBuffers188743680

RedoBuffers2945024

Executedin0.01seconds

--查看临时表空间大小

SQL>selecttablespace_sizefromdba_tablespace_usage_metricswheretablespace_name='TEMP';

TABLESPACE_SIZE

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

4194302

Executedin0.01seconds

测试一:

demo.xml文件大小为32k,文本文件行数为553行

对文本文件插入操作性能比较,测试数据库用户=〉scott;测试文件=〉d:

\xml\demo.xml

●内容为标准的XML格式:

代码2-1XML文件内容:

xmlversion="1.0"encoding="ISO-8859-1"?

>

-

mensagemTISSxmlns:

ans="http:

//www.ans.gov.br/padroes/tiss/schemas">

-

-

 DEMONSTRATIVO_ANALISE_CONTA

 1

 2007-03-26

 16:

33:

46Z

 

-

 123456

 

-

 654321

 

 2.01.01

 

……

●操作系统物理大小:

32kb

测试步骤如下:

(1)用sys用户创建目录,将该目录上的read、write权限赋予scott用户

代码2-2创建两张测试表格:

C:

>sqlplus“/assysdba”

sql>createdirectoryxmldiras‘d:

/xml/’;

目录已创建。

sql>grantread,writeondirectoryxmldir;

授权成功。

(2)创建两张表格,一张包含XMLTYPE类型,一张为字符串类型,代码如1-3所示:

代码2-3使用scott用户创建两张表格:

sql>connscott/tiger@demo

sql>createtablexml_demo

idnumber,

xml_informationxmltype

);

表已创建成功。

Sql>createtablexml_information

idnumber,

informationvarchar2(2000)

);

表格创建成功。

(3)插入字符串列的表格测试结果:

代码2-4将数据插入到xml_information测试

declare

2file_typeutl_file.file_type;

3file_infovarchar2(2000);

4begin_timedate;

5end_timedate;

6

7time_diffnumber;----计算插入数据消耗的时间

8begin

9selectsysdateintobegin_timefromdual;

10

11file_type:

=utl_file.fopen('XMLDIR','demo1.xml','R');

12foriin1..553loop

13utl_file.get_line(file_type,file_info);

14insertintoxml_information

15values(i,file_info);

16

17endloop;

18selectsysdateintoend_timefromdual;

19select(end_time-begin_time)*24*60*60intopfromdual;

20dbms_output.put_line(to_char(begin_time,'yyyy-mm-ddhh24:

mi:

ss'));

21dbms_output.put_line(to_char(end_time,'yyyy-mm-ddhh24:

mi:

ss'));

22

23dbms_output.put_line(‘插入数据消耗时间:

’||time_diff);

24end;

25/

2007-10-2117:

20:

30

2007-10-2117:

20:

30

插入数据消耗时间:

0

(4)将数据插入带XMLTYPE表格测试结果:

代码2-5将数据插入带XMLTYPE表格测试结果

declare

2begin_timedate;

3end_timedate;

4time_diffnumber;

5begin

6selectsysdateintobegin_timefromdual;

7

8insertintoxml_demo

9values(1,xmltype(bfilename('XMLDIR','demo1.xml'),nls_charset_id('AL32UTF8')));

10

11selectsysdateintoend_timefromdual;

12select(end_time-begin_time)*24*60*60intopfromdual;

13dbms_output.put_line(to_char(begin_time,'yyyy-mm-ddhh24:

mi:

ss'));

14dbms_output.put_line(to_char(end_time,'yyyy-mm-ddhh24:

mi:

ss'));

15

16dbms_output.put_line(‘插入数据消耗时间:

’||time_diff));

17

18end;

19/

2007-10-2117:

22:

32

2007-10-2117:

22:

32

插入数据消耗时间:

0

测试结论:

当demo.xml的大小为32kb的时候,将文本文件的数据插入到字符串类型的表格和插入到带XMLTYPE类型的表格的消耗是可忽略的。

测试二:

demo1.xml文件大小为2834k,文本文件行数为48428行

为保证测试的准确性,在测试之前将shared_pool中的数据清空,测试步骤如下:

(1)将demo1.xml数据插入到字符列的xml_information表格中

代码2-6将2834k数据插入到字符串类型的表格中

sql>altersystemflushshared_pool

Systemaltered

declare

2file_typeutl_file.file_type;

3file_infovarchar2(2000);

4begin_timedate;

5end_timedate;

6

7time_diffnumber;

8begin

9selectsysdateintobegin_timefromdual;

10

11file_type:

=utl_file.fopen('XMLDIR','demo1.xml','R');

12foriin1..48428loop

13utl_file.get_line(file_type,file_info);

14insertintoxml_information

15values(i,file_info);

16

17endloop;

18selectsysdateintoend_timefromdual;

19select(end_time-begin_time)*24*60*60intopfromdual;

20dbms_output.put_line(to_char(begin_time,'yyyy-mm-ddhh24:

mi:

ss'));

21dbms_output.put_line(to_char(end_time,'yyyy-mm-ddhh24:

mi:

ss'));

22

23dbms_output.put_line(‘插入数据消耗时间:

’||time_diff));

24end;

25/

2007-10-2117:

55:

13

2007-10-2117:

55:

17

插入数据消耗时间为:

4

(2)将demo1.xml数据插入到带XMLTYPE类型表格xml_demo中

代码2-7将2834k数据插入到xml_demo表格中

SQL>altersystemflushshared_pool;

Systemaltered

SQL>declare

2begin_timedate;

3end_timedate;

4time_diffnumber;

5begin

6selectsysdateintobegin_timefromdual;

7

8insertintoxml_demo

9values(1,xmltype(bfilename('XMLDIR','demo1.xml'),nls_charset_id('AL32UTF8')));

10

11selectsysdateintoend_timefromdual;

12select(end_time-begin_time)*24*60*60intopfromdual;

13dbms_output.put_line(to_char(begin_time,'yyyy-mm-ddhh24:

mi:

ss'));

14dbms_output.put_line(to_char(end_time,'yyyy-mm-ddhh24:

mi:

ss'));

15

16dbms_output.put_line(‘插入数据消耗时间:

’||time_diff));

17

18end;

19/

2007-10-2117:

56:

01

2007-10-2117:

56:

02

插入数据消耗时间:

1

PL/SQLproceduresuccessfullycompleted

测试结论:

文本文件的数据达到2M时,插入到XMLTYPE类型表中的数据时间只有插入字符串类型的表格时间的1/4。

测试三:

以变量形式存储

选取一段XML数据保存在变量中,以变量的形式插入数据库,这部分测试主要针对将变量数据插入到表的性能:

带XMLTYPE列的表和字符串数据类型的表。

详见代码2-8:

代码2-8数据以变量插入到带XMLTYPE类型列的表格中

---创建带xmltype列的表格xml_demo(idnumber,xml_informationxmltype)

SQL>createtablexml_demo(idnumber,xml_information);

Tablecreated

SQL>settimingon

SQL>altersystemflushshared_pool;

SQL>declarexml_sqlvarchar2(4000);

2begin

3xml_sql:

='

41973

5FOODWORLD

6MERCHANT

7foodworld@

8

918SALISBURYARCADE

10TACOMA

………

………

150GROCERYMERCHANT

151';

152

153dbms_output.put_line('字符串长度:

'||length(xml_sql));

154insertintoxml_demo

155values(1,xmltype(xml_sql));

156

157end;

158/

字符串长度:

3731

PL/SQLproceduresuccessfullycompleted

Executedin0.231seconds

SQL>

下面是用字符串数据类型进行测试:

代码2-9数据以变量形式插入到字符串类型列的表格中

---创建字符串类型的表格

SQL>createtabletest(informationvarchar2(4000);

Tablecreated

SQL>altersystemflushshared_pool;

Systemaltered

SQL>declarexml_sqlvarchar2(4000);

2begin

3xml_sql:

='

41973

5FOODWORLD

6MERCHANT

7foodworld@

8

149

展开阅读全文
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1