XML DB简介
Oracle XML DB 是一组专门为 XML 开发的内置高性能存储和检索技术,首次随 Oracle9i 数据库第 2 版推出。OracleXML DB 将 World Wide Web Consortium (W3C) XML 数据模型完全吸收到 Oracle9i 数据库中,并为导航和查询 XML 提供了新的标准访问方法。可以同时获得关系数据库技术和 XML 技术的所有优势。Oracle XML DB 可用于存储、查询、更新、转换或处理 XML,并使用 SQL 查询访问相同的XML数据。
XML常见操作
验证是否安装了 XML DB
运行SQL:
select comp_name from dba_registry where comp_name like '%XML%';
若返回的数据为:COMP_NAME/Oracle XML Database 则证明已经安装XML DB
接下来可以进行XMLDB的操作了
向XMLType或者XMLType column数据表中存放数据
当需要要向Oracle9i数据库中存储XML文档时,可以采取如下的这些方法,包括:
- 在Oracle9i数据库外部将XML文档进行解析,将分析所得到的结果以行的形式存入一个或者多个表中。在这种场景下,数据库不知道正在处理的是XML格式的内容。
- 将XML文档存储在Oracle9i数据库的CLOB或者VARCHAR2字段。这种场景下数据库仍然无法知道正在处理XML文档。但是用户可以使用XDK编写程序来执行XML操作。
- 把XML文档作为XMLType数据类型存储在Oracle9i数据库中。
使用以下两种方式都是有效的:
- 将XML文档存储在XMLType数据列中。
- 将XML文档存储在XMLType数据表中。
采用以上两种方式存储就意味着数据库能够知道正在处理的数据是XML文档,使用这种方法来存放XML文档将给我们带来很大的方便,因为Oracle9i数据库中提供了一系列的新特性,这使得对XML数据进行高效的处理变成了可能。
创建一个带 XMLType 数据列的表
CREATE TABLE XMLCONTENT(
KEYVALUE varchar2(10) primary key,
XMLCOLUMN SYS.xmltype
);
创建一个XMLType表
CREATE TABLE XMLTABLE OF XMLType;
将XML文档转化XMLType实例,然后存储到XMLType表或者带XMLType数据列的表中
grant create any directory to xdb;
conn xdb/xdb
create directory XMLDIR as 'C:"oracle"XMLDB';
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;
/
-- create XMLDIR directory-- connect system/manager-- create directory XMLDIR as '<location_of_xmlfiles_on_server>';
-- grant read on directory xmldir to public with grant option;
-- you can use getCLOBDocument() to generate a CLOB from a file containing
-- an XML document. For example, the following statement inserts a row into the
-- XMLType table Example2 created earlier:
创建函数后即可使用此函数进行数据导入,可以看出我们把路径设置在C盘,此时只需将需导入的文件放在C盘即可,然后运行以下方法即可
INSERT INTO XMLTABLE VALUES(XMLTYPE(getCLOBDocument('test.xml')));
如果不使用Charset参数将默认使用系统的默认字符集环境变量ZHS16GBK.
获取XMLType表或者带有XMLType数据列的表中的数据
一旦一组XML文档存储为许多XMLType表或者许多XMLType数据列之后,下一步要做的就是对存储的数据进行恢复操作。当需要对一组XML文档进行操作时,通常需两个基本工作要做:
决定怎样从一组XML文档中找到需要的子集。
决定怎样更优地从一组XML文档所包含的节点集(nodes)中找到需要的子集。
由于在Oracle9i数据库和XMLType数据类型提供了许多相关的函数使得上述的这些操作变得非常简单。这些函数使用W3C的XPath推荐标准来对一组XML文档中的数据进行导航。
在Oracle XML DB中使用Xpath
XML DB中提供的许多函数都是基于W3C Xpath推荐标准的。Xpath规范规定通过使用“/”符号来访问XML文档中的的元素和属性,例如/A/B,/A@name(name表示属性名)。在XML DB中使用XPath表达式和我们比较熟悉的SQl语句能很好地完成对XML文档的相关操作。
Xpath在Oracle XML DB中的主要作用是结合extract(),extractValue(),和existsNode()等函数来完成一些数据操作。
函数existsNode()的作用是判断在给定的XML文档中是否存在一个与Xpath表达式吻合的节点。如果文档中存在这么一个节点,函数将返回值1。
test XML文档,下面的语句都是基于此XML进行的
<PurchaseOrder >
<Reference>ADAMS-20011127121040988PST</Reference>
<Actions>
<Action>
<User>SCOTT</User>
<Date>2002-03-31</Date>
</Action>
</Actions>
<Reject/>
<Requestor>Julie P. Adams</Requestor>
<User>ADAMS</User>
<CostCenter>R20</CostCenter>
<ShippingInstructions>
<name>Julie P. Adams</name>
<address>Redwood Shores, CA 94065</address>
<telephone>650 506 7300</telephone>
</ShippingInstructions>
<SpecialInstructions>Ground</SpecialInstructions>
<LineItems>
<LineItem ItemNumber="1">
<Description>The Ruling Class</Description>
<Part Id="715515012423" UnitPrice="39.95" Quantity="2"/>
</LineItem>
<LineItem ItemNumber="2">
<Description>Diabolique</Description>
<Part Id="037429135020" UnitPrice="29.95" Quantity="3"/>
</LineItem>
<LineItem ItemNumber="3">
<Description>8 1/2</Description> <Part Id="037429135020" UnitPrice="29.95" Quantity="3"/>
</LineItem>
</LineItems>
</PurchaseOrder>
使用existNode()函数
exitstNode()语法示意图:
寻找一个与XPath表达式匹配的节点
在下面的程序中使用existsNode将返回值“1”:
SELECT existsNode(value(X),'/PurchaseOrder/Reference') FROM XMLTABLE X;
SELECT existsNode(value(X),'/PurchaseOrder[Reference="ADAMS-20011127121040988PST"]') FROM XMLTABLE X;
SELECT existsNode(value(X),'/PurchaseOrder/LineItems/LineItem[2]/Part[@Id="037429135020"]') FROM XMLTABLE X;
SELECT existsNode(value(X),'/PurchaseOrder/LineItems/LineItem[Description="8 1/2"]') FROM XMLTABLE X;
不存在与Xpath表达式匹配的节点
由于不存在与Xpath表达式相匹配的节点,existsNode将返回值0:
SELECT existsNode(value(X),'/PurchaseOrder/UserName') FROM XMLTABLE X;
SELECT existsNode(value(X),'/PurchaseOrder[Reference="ADAMS-XXXXXXXXXXXXXXXXXXXX"]') FROM XMLTABLE X;
SELECT existsNode(value(X),'/PurchaseOrder/LineItems/LineItem[3]/Part[@Id="037429135020"]') FROM XMLTABLE X;
SELECT existsNode(value(X),'/PurchaseOrder/LineItems/LineItem[Description="Snow White"]') FROM XMLTABLE X;
existsNode()函数的最普遍的用法是将其放在SELECT,UPDATE,DELETE等SQL语句的where子句中。这种情况下,Xpath表达式被传递给existsNode() 函数,where语句通过existsNode()函数的返回值来决定数据表中的哪一个XML文档将被SQl语句处理.在where子句中使用existsNode()函数。
SELECT count(*) FROM XMLTABLE x WHERE existsNode(value(x),'/PurchaseOrder[User="ADAMS"]') = 1;
DELETE FROM XMLTABLE x WHERE existsNode(value(x),'/PurchaseOrder[User="ADAMS"]') = 1; commit;
extractValue()
extractValue()函数也是以Xpath表达式为参数,将返回以XMLtype数据类型存放在数据库中的XML文档中的text节点或者节点属性值。这个返回值将以一般对象数据类型的形式返回。
该函数的语法示意图:
extractValue()函数的使用示例:extractValue()的有效使用示例
SELECT extractValue(value(x),'/PurchaseOrder/Reference') FROM XMLTABLE X;
返回:
EXTRACTVALUE(VALUE(X),'/PURCHASEORDER/REFERENCE')
------------------------------------------------------------------------
ADAMS-20011127121040988PST
SELECT extractValue(value(x),'/PurchaseOrder/LineItems/LineItem[2]/Part/@Id') FROM XMLTABLE X;
返回:
EXTRACTVALUE(VALUE(X),'/PURCHASEORDER/LINEITEMS/LINEITEM[2]/PART/@ID')
-----------------------------------------------------------------------
037429135020
extractValue()函数只能返回某一个text节点的的值或者某一个节点的属性值.以下是两个extractValue()函数的无效使用示例。在第一个示例中Xpath表达式可以匹配三个XML文档中的节点,在第二个例子中Xpath表达式指向的是一个树形节点而非某个text节点的值或者某一个节点的属性值。应此可以看到,这两种用法都是无效的使用方法。
extractValue()无效使用示例
SELECT extractValue(value(X),'/PurchaseOrder/LineItems/LineItem/Description') FROM XMLTABLE X;
将extractValue() 使用在where子句中。extractValue() 也可以被放置在 SELECT,UPDATE, 或者DELETE 等SQL语句的where子句中. 这使得我们可以实现XMLType表之间的联接、带有XMLType数据列的表之间的联接、和其他的关系型数据表与XMLType之间的联接。以下的查询展示了怎样在SELECT清单中和where子句中使用extractValue()方法。
SELECT extractValue(value(x),'/PurchaseOrder/Reference') FROM XMLTABLE X, SCOTT.EMP WHERE extractValue(value(x),'/PurchaseOrder/User') = EMP.ENAME AND EMP.EMPNO = 7876;
--返回:
-- EXTRACTVALUE(VALUE(X),'/PURCHASEORDER/REFERENCE')
-- --------------------------------------------------
-- ADAMS-20011127121040988PST
使用extract()函数
语法示意图3-3:
extract()函数用来获取Xpath指向的一组节点。这些节点将以XMLType实例的形式返回。extract() 函数的返回值既可以是一个XML文档也可以是XML文档片断。
使用 extract() 返回XML文档片断
下面的程序使用extract()函数返回XMLType实例。 该实例是一个包含了Xpath所指向的一组Description节点.
SELECT extract(value(X), '/PurchaseOrder/LineItems/LineItem/Description') FROM XMLTABLE X;
-- 返回:
-- EXTRACT(VALUE(X),'/PURCHASEORDER/LINEITEMS/LINEITEM/DESCRIPTION')
-- ------------------------------------------------------------------
-- <Description>The Ruling Class</Description>
-- <Description>Diabolique</Description>
-- <Description>8 1/2</Description>
用 extract() 函数返回 一棵 XPath 表达式指向的节点树
SELECT extract(value(X),'/PurchaseOrder/LineItems/LineItem[1]') FROM XMLTABLE X;
返回:
EXTRACT(VALUE(X),'/PURCHASEORDER/LINEITEMS/LINEITEM[1]')
-------------------------------------------------------------------------
<LineItem ItemNumber="1"> <Description>The Ruling Class</Description> <Part Id="715515012423" UnitPrice="39.95" Quantity="2"/></LineItem>
使用XMLSequence()函数
XMLSequence语法示意图:
XMLSequence()函数可以将XML文档片断转化为一系列的XMLType实例。XMLSequence()函数可以通过获取一个包含XML文档片段的XMLType实例来返回一组 XMLType对象。 这一组对象的中的每一个对象对应一个XML文档片断中的一个根级的节点。 最后,使用SQL TABLE()函数就可以将这一组对象转化为数据
行集合。
使用XMLSequence() 和 TABLE()函数从XML文档中提取Description 的节点值
set long 10000
set feedback on
SELECT extractValue(value(t),'/Description') FROM XMLTABLE X,TABLE ( xmlsequence ( extract(value(X), '/PurchaseOrder/LineItems/LineItem/Description') ) ) t;
返回:
EXTRACTVALUE(VALUE(T),'/DESCRIPTION')
-------------------------------------------------------------------------
The Ruling Class
Diabolique
8 1/2
使用updateXML()方法来更新XML文档
语法示意图:
updateXML() 函数可以用来对XML文档中的节点的属性值,节点,text节点值,树形节点进行更新。更新的对象的位置由Xpath表达式来指定。以下的程序展示了如何对以XMLType形式存放在数据表中的XML文档进行更新操作。使用 updateXML()方法来对XPath表达式所指定的Text节点的值进行更新
XPath表达式为`/PurchaseOrder/Reference':
UPDATE XMLTABLE t SET value(t) = updateXML(value(t), '/PurchaseOrder/Reference/text()','MILLER-200203311200000000PST') WHERE existsNode(value(t),'/PurchaseOrder[Reference="ADAMS-20011127121040988PST"]') = 1;
返回:
1 row updated.
SELECT value(t) FROM XMLTABLE t;
This returns:
VALUE(T)
-------------------------------------------------------------------------
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.oracle.com/xdb/po.xsd">
<Reference>MILLER-200203311200000000PST</Reference>
</PurchaseOrder>
使用 updateXML() 函数来替代Xath表达式所指定的树形节点XPath 表达式: `/PurchaseOrders/LineItems/LineItem[2]'.
UPDATE XMLTABLE t
SET value(t) =
updateXML(value(t),
'/PurchaseOrder/LineItems/LineItem[2]',
xmltype('<LineItem ItemNumber="4">
<Description>Andrei Rublev</Description>
<Part Id="715515009928" UnitPrice="39.95"
Quantity="2"/>
</LineItem>'
)
)
WHERE existsNode(value(t),
'/PurchaseOrder[Reference="MILLER-200203311200000000PST"]'
) = 1;
返回:
1 row updated.
SELECT value(t) FROM XMLTABLE t;
返回:
VALUE(T)
------------------------------------------------------------------------
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.oracle.com/xdb/po.xsd">
<Reference>MILLER-200203311200000000PST</Reference>
<LineItems>
<LineItem ItemNumber="1">
<Description>The Ruling Class</Description>
<Part Id="715515012423" UnitPrice="39.95" Quantity="2"/>
</LineItem>
<LineItem ItemNumber="4">
<Description>Andrei Rublev</Description>
<Part Id="715515009928" UnitPrice="39.95" Quantity="2"/>
</LineItem>
<LineItem ItemNumber="3">
<Description>8 1/2</Description>
<Part Id="037429135624" UnitPrice="39.95" Quantity="4"/>
</LineItem>
</LineItems>
</PurchaseOrder>
参考至:http://blog.csdn.net/rogerjava/article/details/7001241
如有错误,欢迎指正
邮箱:czmcj@163.com
相关推荐
Oracle XML开发手册是一份详尽的指南,专为在Oracle数据库环境中使用XML技术进行开发的IT专业人士准备。手册深入探讨了Oracle对XML的支持,包括数据存储、查询、处理和集成等多个方面,旨在帮助开发者充分利用Oracle...
通过使用`XMLTYPE`字段,可以有效地管理和查询XML文档。其中,`XPath_string`是用于指定在XML文档中查找或操作节点的路径表达式。 - **XMLTYPE_instance**:这是一个特定于XML数据类型的实例,用来存储XML数据。...
综上所述,Oracle XML开发手册是一份全面的参考资料,包含了从XML数据的存储、查询、处理到集成的各个层面,对于任何需要在Oracle环境中使用XML的开发者来说都是一份不可或缺的资源。通过阅读这份手册,开发者能够...
### Oracle XML Publisher 功能与使用详解 #### 一、Oracle XML Publisher简介 Oracle XML Publisher (XDP) 是一款强大的工具,用于将Oracle应用程序中的数据转换为各种格式的文档,包括但不限于PDF、HTML、XML等。...
通过使用XMLType,开发者可以使用标准的SQL语句对XML数据进行操作,极大地简化了XML数据的管理。 在应用开发方面,Oracle XML DB提供了一整套API,包括Java、PL/SQL和.NET等语言的接口,使得开发者能够在各种环境下...
这个PDF手册对于理解Oracle数据库中的XML功能和使用技巧非常有帮助,无论是初学者还是经验丰富的开发者,都能从中获取有价值的信息。通过深入学习和实践,你可以充分利用Oracle对XML的支持,构建高效、灵活的企业级...
3. 存储和管理XML数据:提供了关于如何在Oracle数据库中加载XML文档、如何使用SQL和PL/SQL来操作XML数据以及如何在不同环境中管理和维护XML数据的指导。 4. 访问和查询XML数据:阐述了使用SQL和XQuery语言来访问和...
完整的Oracle xmldom解析xml入参,经过测试,可以解析,成功入到数据表中。
通过这些资源,开发者可以学习到如何在实际项目中使用Oracle XML技术,例如创建XML存储过程、实现XML数据的CRUD操作、优化XML索引以及进行XML数据的转换和验证等。理解并掌握Oracle XML的使用,对于开发涉及XML数据...
- Oracle XML DB提供了一种强大且灵活的方式来管理和存储XML文档,通过使用XMLType数据类型,开发者可以方便地将XML文档集成到现有的数据库应用程序中。 - Oracle XML DB库的引入极大地简化了非结构化数据的管理,...
"Oracle XML Publisher Create Oracle Report"的主题意味着我们将探讨如何使用XML Publisher来构建Oracle数据库相关的报告。 首先,让我们了解XML Publisher的工作原理。它基于XML数据源,这些数据源可以是Oracle...
### Oracle使用XMLDOM包保存XML节点数据到数据库表中的实践 #### 一、背景与需求分析 在实际项目开发过程中,经常会遇到与第三方系统交互的需求。这些第三方接口往往返回的数据格式为XML。为了方便后续处理及存储...
Oracle XML 开发手册是针对使用 Oracle 数据库进行 XML 相关操作的重要参考资料。XML(Extensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件和文档存储等领域。Oracle 数据库支持 ...
Oracle数据库系统是世界上最广泛使用的数据库管理系统之一,而XML(eXtensible Markup Language)作为一种通用的数据交换格式,已经成为网络数据交换的标准。"Oracle与XML开发"这个主题涵盖了这两个技术的结合,旨在...
Oracle XML开发手册是一份详尽的参考资料,专为在Oracle数据库环境中进行XML处理的开发者设计。这份手册涵盖了从基础到高级的各种XML技术,包括XML数据存储、查询、转换以及与传统关系数据的交互等方面。XML...
以下是一些关于Oracle XML Publisher的使用技巧和核心知识点: 1. **BI Publisher基础** - **读者基础要求**:理解XML基本概念,对数据库查询有一定了解,以及具备基本的Microsoft Word(RTF模板开发工具)操作...