作者: fuyuncat
来源: http://www.hellodba.com/reader.php?ID=168&lang=CN
备注:XML DB是Oracle 9.2中出现的新特性。
1 XML DB安装
通过DBCA安装
2 XML DB数据处理
2.1 存储XML数据到XML表中
2.1.1创建一个有XMLType类型字段的表:
create table xmlcontent (keyvalue varchar2(10) primary key,
xmlvalue xmltype);
2.1.2创建一个XMLType类型表
create table xmltable of xmltype;
2.1.3从XML文件中读取数据存储到XML表中
创建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.
创建存储过程,从XML文件中读取数据存储到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:
向表中插入数据:
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表数据
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()更新节点值
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()更新一个节点树
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表中读取数据
主要利用extract(), extractValue(), and existsNode()等几个函数。”Init.xml”的内容参见附录。
2.3.1existsNode ()
EXISTSNODE函数检查XML中的某一个节点是否存在。如果存在,返回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()是从某个节点中读取值
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只能返回一个确切的位置节点的值,如果存在多个相同节点,Oracle就会报错:
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函数返回一个XML文档的一个节点树,或者某一节点下所有符合条件的节点。
返回一个节点树:
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>
返回所有符合条件的节点:
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()返回符合条件的节点的值:
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()函数将XSLT应用到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()函数进行格式处理
SQL> select xmltransform(value(t), xmltype(getclobdocument('example.xsl')))
2 from XMLTABLE t;
2.5 其他XMLType方法
CREATEXML () :一个用来创建XMLType实例的静态方法。
ISFRAGMENT():如果XMLType包含一个文档段则返回1。文档段的意思就是一个没有根节点的XML稳当。文档段一般可以通过Extract()函数产生。
GETCLOBVAL():返回一个CLOB,它包含的内容是基于CMLType内容的XML文档。
GETROOTELEMENT():返回XMLType中XML文档的根元素的名称。
GETNAMESPACE():返回XMLType中XML文档的根元素的名称。
3 XML存储
3.1 结构化存储还是非结构化存储
关于结构化存储和非结构化存储的对比:
特性 |
非结构化XML存储 |
结构化XML存储 |
存储技术 |
XMLType的字段和表的内容都是通过CLOB类型存储 |
XMLType的字段和表的内容都是存为SQL对象的集合。默认情况下,基于schema的XMLType的字段和表的XML模型都是结构化的存储方式 |
是否可以存储非XML的基于schema的表 |
只有当XMLType的字段和表与XML schema无关时可以 |
只有当XMLType的字段和表是基于XML Schema时才可以。 |
性能:存储和获取速度 |
因为在存取操作时,不需要解析和重编译,可以获得很高的存取速度。 |
在存取时较慢。因为在存储时需要将文档切割,而在提取之前需要重新构造。 |
性能:操作速度 |
比结构化存储方式更慢 |
较快 |
灵活性:是否能很容易被处理 |
具有较强的灵活性 |
与Oracle 9i的面向对象特性成反比 |
内存使用情况:XML文档是否需要被解析 |
Oracle XML DB需要解析整个文档到内存中 |
可以使用Oracle XML DB减少内存的使用,并通过以下方式优化对XMLType的字段和表基于DOM的操作: Lazy Manifestation (LM) Least Recently Used (LRU) |
|
|
|
|
|
|
相关推荐
9. **XMLDB 信息库**:提供了类似于文件系统的目录结构,用于组织和管理 XML 内容。 10. **编程访问**:支持多种编程接口,如 Java、C 和 PL/SQL,方便不同开发环境下的应用程序访问 XML 数据。 11. **性能优化**:...
同时,Oracle XML DB还提供了事务处理、安全性、备份和恢复等功能,使得XML数据的管理更加全面和安全。 综上所述,Oracle XML DB为XML数据提供了一套完整的解决方案,包括高效存储、查询和更新机制,以及对XML标准...
1. **XML DB**: Oracle XML DB是Oracle数据库内置的一部分,它提供了一种存储、索引、检索和管理XML文档的方法。XML DB可以直接存储XML文件,或者将XML数据以XMLType类型存储在表中。这允许直接对XML文档进行查询和...
Oracle,由甲骨文公司开发,是全球最大的企业级数据库解决方案之一。它的优势在于其强大的性能、可扩展性和安全性。Oracle支持分布式数据库,能够处理大量并发用户和复杂事务。此外,Oracle还提供了PL/SQL编程语言,...
2. **XMLDB**: Oracle XML DB是一个内置的XML存储和检索组件,它可以直接将XML文件存储在数据库中,无需预先转换为关系模式。 3. **XMLIndex**: Oracle支持创建XML索引来优化对XML数据的查询性能。这些索引可以是...
5. **XMLDB应用程序接口 (API)** - Oracle提供了一系列的API,如Java、.NET、PHP等,用于与XML DB交互,处理XML数据。 6. **安全性** - Oracle数据库为XML数据提供与传统关系数据相同级别的安全措施,包括角色...
### DB2 to Oracle 迁移培训知识点概览 #### 一、DB2 for Oracle Professionals Workshop Coursebook 概述 **DB2 for Oracle Professionals Workshop Coursebook** 是一份由 IBM 提供的专业培训材料,旨在帮助 ...
Oracle数据库凭借其强大的功能和技术优势,已成为世界上最广泛使用的数据库系统之一。Oracle数据库的主要特性包括: - **多进程、多线索的体系结构**:支持大规模并发操作。 - **可联结性**:能够与其他系统无缝...
9. **XML支持**:9i版本加强了对XML的支持,提供了XMLDB(XML数据库)特性,可以直接在数据库中存储和检索XML文档。 10. **PL/SQL**:Oracle 9i 内置的PL/SQL编程语言,是SQL的扩展,允许用户编写复杂的存储过程、...
此外,Oracle还提供了自动存储管理、数据分区、实时备份和恢复等高级特性。 **IBM DB2** IBM的DB2数据库管理系统是一款高性能、面向事务的数据库,适用于大型企业和云环境。DB2支持SQL标准,提供事务处理、并发...
Oracle的核心特性包括ACID(原子性、一致性、隔离性、持久性)事务处理、强大的并发控制、备份恢复机制和安全性。PL/SQL是Oracle特有的编程语言,用于编写存储过程、触发器等数据库操作,它结合了SQL查询功能与面向...
Oracle的XML DB组件提供了对XML数据的全面支持,包括XML索引、XML类型、XMLTable函数等。XMLType是Oracle中的核心XML数据类型,可以直接存储XML文档,并提供了强大的XML查询能力。通过使用XQuery或XPath,可以高效地...
Oracle数据库支持分布式数据库系统,并且具有强大的数据安全性和备份恢复机制。 3. SYBASE:现已被SAP收购,更名为SAP ASE(Adaptive Server Enterprise)。SYBASE以其高性能和低内存占用而受到赞誉,特别是在处理...
通过XMLDB,开发者可以构建XML驱动的应用程序,无缝集成XML数据和关系数据。 在实际开发中,我们需要根据具体需求对比不同技术的优劣,例如文件存储、关系模型和XML处理,选择最合适的数据处理方案。例如,如果数据...
3. **XML在Oracle中的处理**:Oracle数据库支持XMLType数据类型,可以存储XML文档,并提供了强大的XMLDB功能来解析、查询和操作XML数据。使用DBMS_XSL_PROCESSOR或DBMS_XMLGEN等包,可以将XML数据转换为其他格式,...
- **集成程度高**:Oracle 11g与其他Oracle产品有着良好的集成性,可以构建出完整的企业级解决方案。 - **开发效率高**:提供了丰富的开发工具和API,提高了开发人员的工作效率。 - **Oracle存在的不足**:虽然...
10. **XML支持**:Oracle 11g加强了对XML数据的处理,包括XMLDB(XML数据库)和XMLType数据类型,使得存储和检索XML文档变得更加便捷。 11. **PL/SQL增强**:Oracle 11g的PL/SQL语言增加了新的特性,如游标变量的...
Oracle XML DB 简化 XML 管理 Oracle 数据库 10g的备份与恢复特性-恢复管理器与闪回查询技术 Oracle数据库10g:.NET和Windows环境下的最佳数据库 Oracle数据库10g:独立软件供应商和客户的应用系统性能 Oracle...