Oracle XML DB 的使用
XML DB简介
Oracle XML DB 是一组专门为 XML 开发的内置高性能存储和检索技术。OracleXML DB 将 World Wide Web Consortium (W
文章主要内容
本文主要描述了在什么地方和怎样使用Oracle XML DB。文章除了讨论了Oracle XML DB的一般使用场景下XMLType数据的存取(Storage and Acess),以及相关数据的更新(Update)和验证(Validation)而外还解释了为什么学习使用Oracle XML DB对Xpath和XML Schema的学习是有帮助作用的。文中还包括了相关的实例。通过阅读本文可以了解到如何在不同的客户端程序中使用标准的协议来对存储了XML Type数据类型的数据库进行操作。
包括的小节:
n 向XMLType或者XMLType column数据表中存放数据。
n 从XMLType或者XMLType column数据表中取数据。
n 在Oracle XML DB中使用Xpath。
n 使用updateXML()方法更新XML文档。
向XMLType或者XMLType column数据表中存放数据
当需要要向Oracle9i数据库中存储XML文档时,可以采取如下的这些方法,包括:
n 在Oracle9i数据库外部将XML文档进行解析,将分析所得到的结果以行的形式存入一个或者多个表中。在这种场景下,数据库不知道正在处理的是XML格式的内容。
n 将XML文档存储在Oracle9i数据库的CLOB或者VARCHAR2字段。这种场景下数据库仍然无法知道正在处理XML文档。但是用户可以使用XDK编写程序来执行XML操作。
n 把XML文档作为XMLType数据类型存储在Oracle9i数据库中。
使用以下两种方式都是有效的:
n 将XML文档存储在XMLType数据列中。
n 将XML文档存储在XMLType数据表中。
采用以上两种方式存储就意味着数据库能够知道正在处理的数据是XML文档,使用这种方法来存放XML文档将给我们带来很大的方便,因为Oracle9i数据库中提供了一系列的新特性,这使得对XML数据进行高效的处理变成了可能。
Example 3-1 创建一个带 XMLType 数据列的表
Example 3-2 创建一个XMLType表CREATE TABLE Example1
(
KEYVALUE varchar2(10) primary key,
XMLCOLUMN xmltype
);
CREATE TABLE XMLTABLE OF XMLType;
Example 3-3
将XML文档转化XMLType实例,然后存储到XMLType表或者带XMLType数据列的表中
为了将 XML文档存到XMLType数据表或者带XMLType数据列的表中首先必须将XML文档转化为XMlType实例。这个动作可以使用XMLType数据类型所提供的各种各样的构造函数来完成,例如使用一个PL/SQL函数getClobDocument():
使用方法:create or replace function getClobDocument(
filename in varchar2,
charset in varchar2 default NULL)
return CLOB deterministic
is
file bfile := bfilename('c:/',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:
VALUES(XMLTYPE(getCLOBDocument('purchaseorder.xml')));
注意Charset参数的使用,它用来确定指定文件的字符集,如果该参数被忽略,将默认采用当前数据库所采用的字符集,例如在文档invoice.xml中使用的韩文字符集KO16KSC5601,它可以被装载到XMLType数据表XMLDOC数据表中:
values(xmltype(getClobDocument('invoice.xml','KO16KSC5601')));
下面的例子将使用UTF8文件格式
values(xmltype(getClobDocument('invoice.xml','UTF8')));
如果不使用Charset参数将默认使用ZHS16GBK.
获取XMLType表或者带有XMLType数据列的表中的数据insert into xmldoc values(xmltype(getClobDocument('invoice.xml')));
一旦一组XML文档存储为许多XMLType表或者许多XMLType数据列之后,下一步要做的就是对存储的数据进行恢复操作。当需要对一组XML文档进行操作时,通常需两个基本工作要做:
决定怎样从一组XML文档中找到需要的子集。
决定怎样更优地从一组XML文档所包含的节点集(nodes)中找到需要的子集。
由于在Oracle9i数据库和XMLType数据类型提供了许多相关的函数使得上述的这些操作变得非常简单。这些函数使用W3C的XPath推荐标准来对一组XML文档中的数据进行导航。
在Oracle XML DB中使用Xpath
XML DB中提供的许多函数都是基于W
Xpath在Oracle XML DB中的主要作用是结合extract(),extractValue(),和existsNode()等函数来完成一些数据操作。
函数existsNode()的作用是判断在给定的XML文档中是否存在一个与Xpath表达式吻合的节点。如果文档中存在这么一个节点,函数将返回值1。
PurchaseOrder XML文档
本节中的例子都是基于一下的PurchaseOrder XMl文档。
使用existNode()函数<PurchaseOrder
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.oracle.com/xdb/po.xsd">
<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="037429135624" UnitPrice="39.95" Quantity="4"/>
</LineItem>
</LineItems>
</PurchaseOrder>
该函数的语法示意图3-1:
exitstNode()语法示意图:
Example 3-4 existsNode() 示例:寻找一个与XPath表达式匹配的节点
以PurchaseOrder XML为例, 在下面的程序中使用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;
Example 3-5 existsNode() 示例:不存在与Xpath表达式匹配的节点
由于不存在与Xpath表达式相匹配的节点,existsNode将返回值0: