XML在Oracle数据库中的应用.docx
- 文档编号:10407955
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:38
- 大小:71.93KB
XML在Oracle数据库中的应用.docx
《XML在Oracle数据库中的应用.docx》由会员分享,可在线阅读,更多相关《XML在Oracle数据库中的应用.docx(38页珍藏版)》请在冰豆网上搜索。
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)
--------------------------------------------------------------------------------
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||
--------------------------------------------------------------------------------
……
……
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"> - - 33: 46Z - - …… ●操作系统物理大小: 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: =' 4 5 6 7 8 9 10 ……… ……… 150 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: =' 4 5 6 7 8 149
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- XML Oracle 数据库 中的 应用