Oracle编程入门优异,营造和调换XML

Oracle 9i产品扶助文书档案:

在 Oracle 数据库 10g 第 2 版中,Oracle
引进了三个与该数据库集成的专职能自带 XQuery
引擎,该引擎可用来达成与付出帮忙 XML 的应用程序相关的各样职分。XQuery
是一种用于拍卖 XML 数据模型的询问语言,它实质上可操作任何类型的可用 XML
表明的数目。固然 Oracle XQuery
实践使您能够利用数据库数据和表面数据源,但在管理数据库中蕴藏的结构化数据方面,Oracle
XML DB 平日能够映注重帘抓牢品质。

http://docs.oracle.com/cd/B10501_01/index.htm

本文提供的身体力行不止示范了在怎么着场面下以及怎么着利用 XQuery 查询、营造和调换XML,並且还身体力行了什么样监察和控制和剖判 XQuery
表明式的属性执行,进而找到越来越高效的主意来管理同一专门的职业负荷。

可根据自身索要开始展览查询,包蕴了多数的文书档案。

依靠关全面据营造 XML

 

在须求的景况下(比方,向 Web 服务发送结果),您恐怕要根据关周密据创设XML。要在 Oracle 数据库 10g 第 2
版在此以前的版本中产生此职责,平日须求选用 SQL/XML 生成函数,如
XMLElement、XMLForest 和 XMLAgg()。在 Oracle 数据库 10 g 第 2
版中,XQuery 将比这几个函数更为连忙。具体来说,在 XQuery 说明式内部采纳ora:view XQuery 函数,您能够查询现存的涉嫌表或视图以及立即营造XML,进而不须求经过关周密据显式创制 XML 视图。列表 1 中的 PL/SQL
代码演示了怎么着采纳 ora:view 基于示例数据库格局 H奥迪Q3的默许职员和工人涉嫌表中蕴藏的数码塑造 XML 文书档案。

Sample Schemas的目录:

列表 1:使用 ora:view 基于关周到据创立 XML

http://docs.oracle.com/cd/B10501_01/server.920/a96539/toc.htm

BEGIN
IF(DBMS_XDB.CREATEFOLDER('/public/employees')) THEN
DBMS_OUTPUT.PUT_LINE('Folder is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create folder');
END IF;
COMMIT;
END;
/
DECLARE
XMLdoc XMLType;
BEGIN
SELECT XMLQuery(
'for $j in 1
return (
{
for $i in ora:view("HR", "employees")/ROW
where $i/EMPLOYEE_ID <= 102
return (
{xs:string($i/EMPLOYEE_ID)}
{xs:string($i/LAST_NAME)}
{xs:integer($i/SALARY)}
)} )'
RETURNING CONTENT) INTO XMLdoc FROM DUAL;
IF(DBMS_XDB.CREATERESOURCE('/public/employees/employees.xml', XMLdoc)) THEN
DBMS_OUTPUT.PUT_LINE('Resource is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create resource');
END IF;
COMMIT;
END;
/

 

在列表 1 中的第三个 PL/SQL 进程中,您只是在 XML
消息库中创立了二个新文件夹。在该新闻库文件夹中,您随后将储存此处彰显的第2个PL/SQL 进程中开创的 XML 文书档案。首个 PL/SQL 进程首先发出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周密据营造 XML。对于 XQuery
表明式(XMLQuery 在这里将其视作参数)来讲,请留神嵌套的 FLWOKuga表达式中使用的 ora:view XQuery 函数。在该示例中,ora:view
获取七个输入参数,即“HOdyssey”和“employees”,它们提示该函数查询属于 H卡宴数据库情势的员工表。由此,ora:view 将回到三个表示 HCRUISER.employees
表行的职工 XML
文档系列。但为了节省结果文书档案中的空间,只将前八个职工记录传递给结果系列。那是因而在
FLWOEnclave 表明式的 where 子句中钦赐 $i/EMPLOYEE_ID <= 102
而落到实处的。请小心 FLWOLX570 表明式的 return 子句中应用的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的这五个 XQuery
表明式不唯有将 XML
节点值转换为对应的种类,何况还将提取那么些节点值。随后,生成的职员和工人 XML
文书档案作为 employees.xml 保存到事先在列表 1 中另贰个 PL/SQL 进度中创建的
/public/employees XML 音信库文件夹。要保管此操作已成功,可举办以下查询:

Sample Schemas的文书档案(示例方式的表及介绍):

SELECT XMLQuery('for $i in fn:doc("/public/employees/employees.xml")
return;
$i'
RETURNING CONTENT) AS RESULT FROM DUAL;

http://docs.oracle.com/cd/B10501_01/server.920/a96539.pdf

该查询应生成以下输出:

 


100
King
24000


101
Kochhar
17000


102
De Haan
17000

多数年来,Oracle助教、管理员、工程师、以及用户为了求学、测量检验或调度他们的数据库,都直接在利用那么些值得依赖的SCOTT格局张开着简单地查询、更新、以及去除操作。那几个方式正是我们所说的以身作则形式。示例格局是表、视图、索引那样的数据库对象的集纳,並且随着预先供了表示小框框依然中等规模集团的数目。

在上述 XQuery 中,fn:doc XQuery 函数用于访问 Oracle XML DB
新闻库中积攒的单个 XML 文书档案。但万一要管理局地怀有同样或貌似结构的 XML
文书档案(存款和储蓄在同一 XML
音讯库文件夹中),应该如何做?这种状态下,另一个用来拍卖 XML
音信库能源的 XQuery 函数(即
fn:collection)或然会派上用场。本文稍后将介绍几个有关怎样使用
fn:collection XQuery 函数的演示。

乘胜新型版本的Oracle数据库Oracle
9i的面世,又引入了全新的一组示例方式,它们的指标是扩徐熙媛(Barbie Hsu)COTT方式向用户提供的效果。全数那个形式一同形成了平等的设想公司的一某些,它们各自都有和煦的专门的学业余大学旨。比方,人力能源部、订单输入部门以及发货部门都有离别的情势。

查询 XMLType 数据

注意:

XQuery 让你能够操作基于 XML
情势以及非基于格局的数目。以下示例演示了何等利用 XMLTable 函数从 OE
演示数据库形式中询问基于 PurchaseOrder XML 形式的 XMLType 表。

当前hr已经锁定了(即lock)。要求实施以下脚本:

SELECT ttab.COLUMN_VALUE AS OrderTotal FROM purchaseorder,
XMLTable(
'for $i in /PurchaseOrder
where $i/User = "EABEL"
return;

{$i/Reference}

{fn:sum(for $j in $i/LineItems/LineItem/Part
return ($j/@Quantity*$j/@UnitPrice))}

'
PASSING OBJECT_VALUE
) ttab;
SQL> connect system/zyf;

已连接。

SQL> alter user hr account unlock;

用户已更改。

SQL> alter user hr identified by hr;

用户已更改。

SQL> connect hr/hr;

已连接。

SQL> select table_name from user_tables;

TABLE_NAME

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

COUNTRIES

DEPARTMENTS

EMPLOYEES

JOBS

JOB_HISTORY

LOCATIONS

REGIONS

已选择7行。

在上述示例中,您在 XMLTable 函数的 PASSING 子句中运用 OBJECT_VALUE
虚构列将 purchaseorder 表作为左右文项传递给此间使用的 XQuery
表达式。XQuery 表明式计算用户 EABEL
哀告的各种购买订单的总计,并为管理的各个订单生成三个 OrderTotal XML
元素。要访问生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE
虚构列。最后的输出应如下所示:

4.1 SCOTT模式

所提供的SCOTT格局能够提供部分示例表以及数额,来显示数据库的一部分表征。它是二个一定简单的形式,如图4-1数据结构图所示(通过PowerDesign逆向工程调换为数据库模型)。

图4-1 SCOTT方式数据结构图

 图片 1

干什么要将以此情势命名称为SCOTT呢?SCOTT/TIGE讴歌ZDX是Oracle版本1、2和3时期的Oracle数据库的开始的一段时期用户名/密码组合。SCOTT是指Oracle集团的长者程序猿BruceScott。当然,TIGE奇骏是Bruce养的猫的名字。

SCOTT情势中所体现的数据库本性通常被感到是绝大好多关全面据库产品中的紧要特征。若是想要真实地显示Oracle数据库的功能,将在强化那些示例!

ORDERTOTAL
-------------------------------------------------------------

EABEL-20021009123338324PDT
1328.05


EABEL-20021009123335791PDT
2067.15


EABEL-20021009123336251PDT
289.6


EABEL-20021009123336382PDT
928.92

4.2 Oracle 9i示例方式

Oracle技巧能够采纳于种种区别的条件中。技艺化解方案的多个使用极端景况是,高速在线事务管理和数据库酒店。就算用户能够行使两个形式,突显什么在同一的表中完结在线事务处理和数据仓库。可是用户毫无只怕行使这种办法完毕实用的消除方案。大家在现在的产业界中经常能够开掘,为了化解实际世界中的差异计算要求,平日在独立的数据库实例中会存在不一致的情势,恐怕在互连网上会有大气布满式数据库。新的Oracle
9i示例方式模型极好地对那些情景建立模型。

Oracle
9i示例形式试图模型化二个切实可行世界中负有一多元规范业务部门的销售团队。这么些分化的部门有着分歧的消息工夫须要,每一个示范情势都利用了差别的Oracle技艺来解决它们各自的标题。别的,每一个方式设计方案都对准一定的手艺用户。那一个情势如下:

  • H传祺——人力财富。
  • OE——订单输入。
  • PM——产品媒体。产品媒体在数据库中存放了信用合作社连串产品的相关多媒体内容,能够用于在Web上颁发以及打字与印刷。PM利用了Oracle
    Intermedia,它特别设计用来拍卖发表音频、录像以及可视数据的多媒体领域。别的,PM也频繁地应用了LOB列类型。
  • QS——队列运送。运送部门各负其责记录公司向客户开始展览的制品运载情形,并且利用6个格局来造成那项工作。QS、QS_ES、QS_WS、QS_OS、QS_CB和QS_CS构成了队列运送情势的聚众。
  • SH——出售历史。

要收获一致的末梢结出,能够改用 XMLQuery 函数。但只要将上二个示范中利用的
XQuery 表明式参数字传送递给 XMLQuery(如下所示):

4.2.1 深切座谈各种形式

SELECT XMLQuery('for $i in /PurchaseOrder
where $i/User eq "EABEL"
return 
{$i/Reference}

{fn:sum(for $j in $i/LineItems/LineItem/Part
return ($j/@Quantity*$j/@UnitPrice))}

'
PASSING OBJECT_VALUE
RETURNING CONTENT)
FROM purchaseorder;

1. 人力财富

人力能源形式,恐怕HENVISION形式,肩负处理部门、雇员、专门的学问以及薪给新闻。图4-2显得了HENCORE格局的详细数据结构图示。

图片 2

则 XQuery 表明式重临的空类别将与 purchaseorder
表联接,进而包蕴在查询总计果聚焦。实际上,那意味输出将不止满含为用户
EABEL 央浼的订单生成的 OrderTotal 成分,并且还富含为 purchaseorder
表中蕴藏的具备其余订单生成的空行(暗中同意境况下,purchaseorder 表包蕴 132
行)。从结果聚焦拔除空行的主意之一是在 SELECT 语句的 WHERE 子句中利用
existsNode SQL 函数,实际不是在 XQuery 说明式中选拔 WHERE 子句,如下所示:

2. 订单输入

订单输入(Order
Entry)格局,或许OE格局,能够用来保管公司从事商务活动的逐条路子中的客户、贩卖订单以及产品仓库储存。

图4-3详细刻画了OE情势的数据结构。就好像大家此前了然的,与人力能源情势比较,订单输入格局越发复杂。

图片 3

图4-3 OE方式数据结构

OE形式会记录产品仓库储存。大家将会积累放肆钦赐仓库中钦命产品的数量。在信用合作社中会有多少个仓库,所以要运用地点标志符提出其地理区域。在WAREHOUSES表中还会有贰个Oracle
Spatial列,它为大家提供了运用Oracle Spatial空间本事的钥匙。

Oracle Spatial是在数据库中帮助地点数据和地理数据的本领。

在OE形式中,须要顺便提供聊到四个数据库对象模型:

  • CUST_ADDRESS_TYP。那是多个在CUSTOMEEvoqueS表中接纳的靶子类型。它含有了成都百货上千与客户地址有关的特性。

SQL> desc cust_address_typ;

名称 是否为空? 类型

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

STREET_ADDRESS VARCHAR2(40)

POSTAL_CODE VARCHAR2(10)

CITY VARCHAR2(30)

STATE_PROVINCE VARCHAR2(10)

COUNTRY_ID CHAR(2)
  • PHONE_LIST_TYP。那是叁个VARCHA昂Cora2(25)的VAHavalRAY。那些VA宝马X3RAY在CUSTOME福睿斯S表中作为单身的列存储,能够用于存款和储蓄最多5个电话号码。

SQL> desc phone_list_typ;

phone_list_typ VARRAY(5) OF VARCHAR2(25)

OE方式是多个很好的示范,它展现了标准的供应组织也许计算机零售市肆能够利用什么点子去管理它们完整订单管理进程。通过接纳订单输入表中的多寡,销售团队就足以向地下的客户提供高精度的出品新闻,接受出卖订单,量化订单收入,存储客户音信,为差异地理地方订购产品的客户提供规范的仓库储存消息,以及别的服务。

SELECT XMLQuery('for $i in /PurchaseOrder
return 
{$i/Reference}

{fn:sum(for $j in $i/LineItems/LineItem/Part
return ($j/@Quantity*$j/@UnitPrice))}

'
PASSING OBJECT_VALUE
RETURNING CONTENT) AS ordertotal
FROM purchaseorder
WHERE existsNode(OBJECT_VALUE, '/PurchaseOrder[User = "EABEL"]') = 1;

3. 产品媒体

产品媒体(Product
Media)情势,可能PM方式,用于管理描述集团出品的多媒体数据。录像、音频和图像那样的在线媒体都足以随输出的媒体数据类型存款和储蓄在数据库中。那是我们要特地商量的形式之一,它注重于多媒体内容,以及Oracle
Intermedia所提供的功力。

注意:

Oracle Intermedia是Oracle数据库帮衬多媒体内容类型的零部件。

除此而外Intermedia数据存款和储蓄以外,PM格局还特意注重LOB列类型的选用来存款和储蓄数据。

出品媒人体模型式是Oracle 9i使用名字为Oracle
Intermedia的Oracle能力消除现实世界商务须要的美貌示例。比如,我们虚拟的合作社就足以储存多媒体数据依旧输出多媒体数据。由此,产品媒人体模型式中的示例可以成功如下工作:

  • 为Oracle中运用Web公布的源委存款和储蓄缩略图和完全尺寸的图像。
  • 在Oracle中蕴藏音频剪辑。
  • 在Oracle中贮存录制剪辑。
  • 对图像类型进行拍卖,以便调换到与Web兼容的图像类型

接纳Oracle
Intermedia,一些业已很难完成的职责就变得相对简便易行。图4-4表示为产品媒人体模型式,以及它对订单输入表PRODUCT_INFORMATION的引用。

图片 4

图4-4 PM情势数据结构

PRINT_MEDIA表具有多个目的类型(ADHEADE智跑_TYP),以及在表的顺序记录中存款和储蓄的对象嵌套表(TEXTDOC_TAB)。

ORDSYS.ORD__列都是三个Intermedia对象类型。这个Intermedia对象类型不只能够积攒图像、音频、摄像那样的二进制数据;还是能储存种种与多媒体类型有关的元数据。

SQL> desc ordsys.ordimage;

如上查询与本有的先河的 XMLTable 示例生成同样的出口。

4. 队列运送

笔者们的虚拟公司想要使用信息系统,以利于在线客户实行自助订货。当客户起首化订货的时候,系统就要求树立订单,向客户提供账单,而且要确定保证能够依据客户的职责,通过适当的地段发送订货。

QS_CS情势有一个名叫OSportageDE中华V_STATUS_TABLE的表,能够积存订单状态。那是在全路队列运送形式安装进程中唯第一建工公司立表(除了通过高档队列API创建的连串表以外)。我们不会来得与表有关的数据结构图,而是要研商为队列运送格局所建立的队列系统中的音信流程。

图4-5所示流程图示中得以见到,为了提供八个鲜明、直观的订购——发货——付钱循环,要在部门之间怎样传递音信。

图片 5

图4-5 为队列运送(QS)形式在队列系统中国建工业总会公司立的音讯流程

一体都要从图示顶端的订单输入伊始。Oracle
Input(订单输入)进程所生成的订单会放入New Order
Queue(新订单队列)中。这一个队列要Oracle
Entry应用管理,然后会将订单放到Booked Orders
Queue(登记订单队列)中。再将Booked Orders
Queue中的订单发往适中的运输中央(East(南边)、West(东部)也许Overseas(外国)),以及客户服务机构。

在那时候,运送中央就能够吸收要完毕的订单,何况向客户发送订货,况兼客户服务单位也会意识到订单的情事。在适用的运输大旨,Shipping
Center(运送中央)应用就能够担任发送订货,或然将预定调度回订单状态。一旦获得了产品,就能够发送退回为订单状态的制品,何况将订单放到shipped
orders(已运送订单)队列中。

当订单发送之后,就能够透过shipped orders
gueue布告客户服务和客户买下账单部门,并且向客户发送账单。经过买单的订单会放在Billed
Orders(已买下账单订单)队列中,它会打招呼客户服务机构,然后就能够产生订单管理进程。

询问 Oracle XML DB 新闻库中的 XML 数据

5. 售货历史

至今商务条件中的公司一度开掘,除非大家能够使用一种有含义而且即时的方法,依照音讯变化正确的裁定报告,不然世界上的持有发卖音信都是毫无价值的。决策帮忙(decision
support)正是用来描述在拓展裁定的长河中国国投息才具利用的术语。

出卖历史格局是贰个价值观数据仓库的示范。表会依据星型方式(star
schema)设计开始展览集体,在这种艺术下,会有二个大的SALES表位于宗旨,SALES表的外场还有一点小的查询表,或许维数(dimension)表。SALES表常常会有大气的数额(全数的行销实时),而维数表相对于SALES表来说会非常的小。

图4-6的数据结构图展现了发卖历史格局:

图片 6

图4-6 出卖历史格局数据结构

为访谈 Oracle XML DB 消息库中存放的 XML 数据,Oracle XQuery 引进了
fn:doc 和 fn:collection XQuery 函数。使用 fn:doc,您能够查询 XML
信息库中积累的单个 XML 文书档案,而 fn:collection
使您能够访谈同一消息库文件夹中存款和储蓄的多少个 XML 文书档案。

4.2.2 渐进学习情势

依据不相同的受众组织情势的措施能够鼓励新的Oracle用户通过结构化的不二秘诀学习本领。举个例子,初学者能够从人力能源初阶。这能够让她深谙关系概念、查询数据、数据库操作语言、数据库定义语言、以及部分别样基本概念。

当新Oracle用户熟练了人力财富方式之后,能够继续剖判订单输入形式。在那些新情势中,他将会遇见对象类型、XML协助、Oracle
Spatial、以及别的界分比较高档的数据库性子。

接下去,用户能够深入分析任何情势所提供的一定领域。多媒体专家能够深深学习产品媒人体模型式。设计发布-订阅型基于音信的体系的用户能够窥见,队列运送情势在他们起始学习Oracle高档队列的时候将会异常有扶持。数据旅馆的热衷者最棒去解析和询问发售历史情势。

正如本文在此以前(参阅使用关全面据创设 XML部分)介绍的示范所示范,使用
fn:doc 特别轻易直接。它获得表示音讯库文件财富 (U中华VI) 的字符串并赶回该 UPRADOI
指向的文书档案。要打听 fn:collection XQuery
函数的效能,同一文件夹中最少应当八个音信库文件。倘使已经运转了列表 第11中学的代码,则已经创办了 /public/employees 信息库文件夹并在当中蕴藏了
employees.xml 文件。因而,您将须求在该文件夹中至少又创立多个 XML
文件,然后能力试用 fn:collection。列表 2 中的 PL/SQL 代码基于
SCOTT/TIGE陆风X8 演示数据库情势的 dept 和 emp 表存款和储蓄的关全面据构建XML,然后将扭转的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees
音讯库文件夹。要运转列表 2 中的 PL/SQL 进度,请确定保障以 SCOTT/TIGE福睿斯的地方登陆。

4.2.3 发掘更加的多关于示例情势的内容

列表 2:基于关周密据构建 XML 并将其保存到 XML 信息库

1. 数据库对象描述

在那某当中,我们将会浏览数据库,找到属于示例方式下的对象,然后使用SQL查询直接从数据库中拿走这么些目的的概念。

注意:

以下试验部分所需的方方面面脚本都足以从http://www.wrox.com/的本书可下载代码中收获。

考察:获取数据库列表

将以下脚本保存到用户当地硬盘上名字为dbls.sql的文本中(C:\oracle\ora92\bin,即sql*plus职业目录)

column object_name format a30

column tablespace_name format a30

column object_type format a12

column status format a1

break on object_type skip 1

select object_type,object_name,

decode(status,'INVALID','*','') status,

tablespace_name

from user_objects a,user_segments b

where a.object_name=b.segment_name(+)

and a.object_type=b.segment_type(+)

order by object_type,object_name

/

column status format a10

运作以下代码可获得数据库对象列表:

SQL> connect hr/hr;

已连接。

SQL> @dbls
DECLARE
XMLdoc XMLType;
BEGIN
SELECT XMLQuery(
'for $j in ora:view("SCOTT", "dept")/ROW
where $j/DEPTNO = 10
return ( 
{$j/DEPTNO,
$j/DNAME}
 {
for $i in ora:view("SCOTT", "emp")/ROW
where $i/DEPTNO = $j/DEPTNO
return (

{$i/EMPNO,
$i/ENAME,
$i/SAL}
)} 

)'
RETURNING CONTENT) INTO XMLdoc FROM DUAL;
IF(DBMS_XDB.CREATERESOURCE('/public/employees/acc_dept.xml', XMLdoc)) THEN
DBMS_OUTPUT.PUT_LINE('Resource is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create resource');
END IF;
COMMIT;
END;
/

2. 自解释方式

Oracle提供了一种能够让表的主人在数据库中存储表可能列的纯文本注释的办法。在演示形式安装时期,每种方式都具有贰个剧本,可感觉它们各自的表和列创设那几个注释。那能够利用SQL命令CREATE
COMMENT达成。当中注释样本如下:

COMMENT ON TABLE jobs

IS ‘jobs table with job titles and salary ranges.Contains 19 rows.

References with employees and job_history table.’;

此时,/public/employees
音信库文件夹应涵盖八个文件:acc_dept.xml(由列表 2 中的 PL/SQL
代码生成)和 employees.xml 文件(由列表 1 中的代码生成)。由于这个 XML
文书档案存款和储蓄在平等消息库文件夹中,因而得以选择 fn:collection 函数访问八个XML 文书档案中累积的职工音讯。可是,就算那几个 XML 文书档案均含有职员和工人 XML
成分(这几个成分实际上具备同等结构),但 XML 文书档案本人的布局迥然不相同。在
employees.xml 中,文书档案根元素为 EMPLOYEES,而 acc_dept.xml 将 DEPARTMENT
用作根成分。要消除此主题材料,能够透过 XQuery 使用 XPath // 构造,进而导航到
XML 文书档案中的某些节点,而不要钦命该节点的适度路线。以下示例演示了怎么样在
XQuery 表达式中动用 XPath // 构造:

4.3 小结

小说依据自身精晓浓缩,仅供参考。

摘自:《Oracle编制程序入门优良》 哈工业余大学学东军事和政院学出版社 http://www.tup.com.cn/

SELECT XMLQuery(
'for $i in fn:collection("/public/employees")//EMPLOYEE
where $i/SAL >= 5000
order by $i/ENAME
return;
$i'
RETURNING CONTENT) FROM DUAL;

该协会应生成以下输出:

102
De Haan
17000


7839
KING
5000


100
King
24000


101
Kochhar
17000

你可以看出,以上输出满含从 employees.xml 和 acc_dept.xml 中收获的职工
XML 成分,这个成分表示薪水大于或等于 5,000 澳元的职工。

将 XML 分解为关周全据

设若应用程序管理关周详据而非 XML,而你供给拜会的数量以 XML
格式存款和储蓄,则将 XML
分解为关全面据恐怕会那么些有效。继续拓展上一些的演示,您能够使用 SQL
函数 XMLTable 将职工 XML 成分分解为设想表的单个列,如下所示:

SELECT emps.empno,emps.ename, emps.sal FROM 
XMLTable(
'for $i in fn:collection("/public/employees")//EMPLOYEE
where $i/SAL >= 5000
return;
$i'
COLUMNS empno NUMBER PATH '/EMPLOYEE/EMPNO',
ename VARCHAR2(30) PATH '/EMPLOYEE/ENAME',
sal NUMBER PATH '/EMPLOYEE/SAL') emps;

该查询将转移以下输出:

EMPNO ENAME SAL
----- -------------- ----------
7839 KING 5000
100 King 24000
101 Kochhar 17000
102 De Haan 17000

查询外界数据源

选用 XQuery,能够依靠 XML 数据以及能够用 XML 表示的非 XML 数据生成 XML
文档,无论其职务怎么:无论是存款和储蓄在数据库中、置于网址上、即时创设大概存款和储蓄在文件系统中。但要注意,Oracle
XML DB 为针对数据库中积存的多寡进行的 XML
操作提供了极高的属性和可伸缩性。由此,假诺你能够完全调控所拍卖的数目,则最棒将它移动到数据库中。

正如你之前方的演示中了然到的,在 Oracle XQuery 执行中,doc 和 collection
XQuery 函数用于访谈 Oracle XML DB 新闻库中寄放的 XML 文书档案。能够经过
XMLTable 和 XMLQuery SQL 函数中的 PASSING
子句动态绑定外界数据源。考虑以下示例。要是你的公司要为那个从事于 XQ
项指标职工支付奖金。由此,财务部宣布了 empsbonus.xml
文件,个中包括有资格猎取奖金的职工列表以及该列表中输入的各样员工的奖金数额。empsbonus.xml
文件可能如下所示:

100
1200


101
1000

在其实际景况况中,以上的 XML
文件或然置于网址上(因而得以经过网络得到)、以文件格局积攒在本土文件系统中,或以文件能源情势积攒在
Oracle XML DB
新闻库中。就本示例来说,该文件位于网址上。为简便起见,能够在目录(Web
服务器在里边存款和储蓄可从 Web
看到的文书档案)中创设一个职员和工人文件夹,然后在该文件夹中插入 empsbonus.xml
文件,以便能够经过以下 ULANDL 访谈 empsbonus.xml 文件:

http://localhost/employees/empsbonus.xml

接下去,假诺您供给依据 empsbonus.xml
文书档案中存放的数目创立贰个报表。在该报表中,您大概不只要包蕴列表中显得的奖金多寡以及种种职员和工人的职工
ID,还要满含他/她的全名。因而,能够率先应用以下查询生成三个新的 XML
文书档案(若是你以 H奥迪Q7/HPAJERO 的身份连接):

SELECT XMLQuery(
'for $k in 1
return (
 {for $i in ora:view("employees")/ROW,
$j in $emps/EMPLOYEES/EMPLOYEE
where $i/EMPLOYEE_ID = $j/EMPNO
return (
{xs:string($i/EMPLOYEE_ID)}
{xs:string(fn:concat($i/FIRST_NAME, " ", $i/LAST_NAME))}
{xs:integer($j/BONUS)}
)} )'
PASSING xmlparse (document httpuritype
('http://localhost/employees/empsbonus.xml').getCLOB()) as "emps"
RETURNING CONTENT).getStringVal() as RESULT FROM DUAL;

以上查询是三个关于如何行使 XQuery 基于 XML 和非 XML
数据(以不一致的方法从差异的数量源中检索)生成 XML
文书档案的言传身教。具体来讲,使用 ora:view() 函数访问 HR 演示情势中的暗中同意
employees 关系表,并使用 PASSING 子句中的 httpuritype() 函数借助于
HTTP 访谈 empsbonus.xml 文书档案。然后,在 FLWOR 表达式的 return
子句中创设新的 XML 文书档案。最后,将赢得以下 XML 文书档案:


100
Steven King
1200


101
Neena Kochhar
1000

缓慢解决品质难点

正如您从最近的有些中询问到的,XQuery 是一种用于查询 Oracle 数据仓库储存款和储蓄的
XML 内容的迅猛方法 – 无论你是拍卖地点存款和储蓄的 XMLType
数据依然查询基于关全面据营造的 XML
视图。但依附对数码运用的积累类型的不等,XQuery
表明式的实践质量恐怕天地之别差别。特别是,Oracle XML DB 能够优化基于由
ora:view 函数创制的 SQL/XML 视图而创设的 XQuery 表达式。对于 XMLType
表或列中存款和储蓄的 XML 数据,只可以对利用结构化(对象-关系)存款和储蓄手艺存款和储蓄的按照XML 格局的 XMLType 数据实行 XQuery 优化。

所选用的存款和储蓄模型并非是震慑 XQuery
表达式实践品质的并世无双要素。在少数意况下,XQuery
表达式本人的结构也可能引致质量难题。要监察和控制 XQuery
表达式的品质,能够打字与印刷并检讨关联的 EXPLAIN PLAN。在 SQL*Plus
中,只需安装 AUTOTRACE 系统变量,就可以打字与印刷 SQL
优化程序选取的奉行路线。但要试行该操作,请保管创立 PLUSTRACE
剧中人物,然后将其予以连接到数据库所运用的用户。有关如何进行此操作的新闻,请参阅
Oracle 数据库 10g 第 2 版 (10.2) 文书档案中《SQL\Plus
用户指南和参照》一书中的“调治SQL\Plus”一章。以下示例演示了怎么通过检查 EXPLAIN PLAN
生成的奉行安顿来获得利润。即让你已经将 PLUSTRACE 剧中人物赋予暗中认可用户 OE,以
OE/OE 的地点登陆并运维以下查询:

SET AUTOTRACE ON EXPLAIN
SELECT count(*)
FROM oe.purchaseorder, XMLTable(
'for $i in /PurchaseOrder/User
where $i = "CJOHNSON"
return $i'
PASSING OBJECT_VALUE) ptab;

那将扭转以下输出:

COUNT(*)
----------
9
Execution Plan
---------------------------------------------
Plan hash value: 4046110317
--------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 226 | 29 (0) | 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 226 | | |
| 2 | NESTED LOOPS | | 10782 | 2379K | 29 (0) | 00:00:01 |
|* 3 | TABLE ACCESS FULL | PURCHASEORDER | 1 | 226 | 5 (0) | 00:00:01 |
| 4 | COLLECTION ITERATOR P| XMLSEQUENCEFROMX| | | | |
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter(SYS_CHECKACL("ACLOID","OWNERID",xmltype('...

您大概对为上述查询生成的实践布署并不比意。特别是,所管理的行数可能那么些大。由于
SQL
调解的要害对象是制止访问对结果尚未任何影响的行,由此可能要继续调度查询以优化质量。对查询中蕴藏的
XPath 表达式举办再度建立模型后,能够再度重试它,如下所示:

SELECT count(*)
FROM oe.purchaseorder, XMLTable(
'for $i in /PurchaseOrder
where $i/User = "CJOHNSON"
return $i/User'
PASSING OBJECT_VALUE) ptab;
这次,输出应如下所示: 
COUNT(*)
----------
9
Execution Plan
---------------------------------------------------
Plan hash value: 3411896580
---------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 29 | 7 (0) | 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 29 | | |
| 2 | NESTED LOOPS | | 1 | 29 | 7 (0) | 00:00:01 |
| 3 | FAST DUAL | | 1 | | 2 (0) | 00:00:01 |
|* 4 | TABLE ACCESS FULL | PURCHASEORDER | 1 | 29 | 5 (0) | 00:00:01 |
Predicate Information (identified by operation id):
---------------------------------------------------
4 - filter("PURCHASEORDER"."SYS_NC00022$"='CJOHNSON' AND
SYS_CHECKACL("ACLOID","OWNERID",xmltype('...

你能够见见,以上显示的询问生成同样的最后结出,但它们的执行陈设并差别样。查看最终叁个示范中的
XQuery 表明式,您大概会注意到它迭代顶层 PurchaseOrder 成分,在那之中的各个PurchaseOrder 成分都意味依据 PurchaseOrder XMLType
形式的表中的一条龙。那意味实际上海重机厂写 XQuery
表达式,以迭带基础对象表(用于存储分解的 PurchaseOrder
文档)中的行。与查询要迭代不意味基础表中的单个行的 XML
成分相比,该办法的品质更加好一些。

但在好几境况下,很难发掘 XQuery
表明式的哪位构造将使一些查询的习性更加好。这正是干吗最佳在开辟阶段使用调度工具的案由。

将动态变量绑定到 XQuery 表明式

另一种能够显明升高 XQuery
表达式实施品质的本领是行使绑定动态变量。使用绑定变量(并不是将变量串联为字符串)能够使
Oracle 重用 SQL 语句,进而收缩深入分析花费并确定进步应用程序的性质。能够在
XMLQuery 和 XMLTable SQL 函数中选择 PASSING 子句将动态变量绑定到 XQuery
表达式。该技艺令你能够依靠客户端代码中总结的参数动态生成 XML。列表 3
中的示例演示了什么样在从 PHP 脚本试行的 XQuery 查询中采纳绑定变量。

列表 3:使用绑定变量

//File:BindVars.php
$user = 'hr';
$pswd = 'hr';
$db ='(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))
)
(CONNECT_DATA=(SID=orclR2)(SERVER=DEDICATED))
)';
$empno=100;
$conn = oci_connect($user, $pswd, $db);
$sql = 'SELECT XMLQuery('."'".'for $i in ora:view("employees")/ROW
where $i/EMPLOYEE_ID = $empno
return (
{$i/EMPLOYEE_ID,
$i/EMAIL,
$i/JOB_ID}
)'."'".'PASSING XMLElement("empno", :empno) AS "empno"
RETURNING CONTENT).GetStringVal() AS RESULT FROM DUAL';
$query = oci_parse($conn, $sql);
oci_bind_by_name($query, ":empno", $empno, 3);
oci_execute($query);
oci_fetch($query);
$str = oci_result($query, 'RESULT');
print $str;
?>

列表 3 中展现的脚本应生成以下输出(注意,浏览器中或者不会展现标志):

100
SKING
AD_PRES

XQuery 与 XSLT

固然 Oracle 在 Oracle XML DB 中提供了贰个自带 XSLT
管理器,但在不计其数场所下(越发是在管理大型文书档案时),XQuery 对于构建 XML
更加快捷。此外,XQuery 表明式日常比为同一作业设计的 XSLT
样式表更具可读性,并且更清楚。与 XSLT 一样,XQuery 不但可用来将三个 XML
文书档案调换为另八个 XML 文书档案,何况还可用以将 XML
调换为另一种基于文本的格式,如 HTML 或 WML。

在本文前边的询问 XMLType 数据部分中,您看来了一个关于使用 XQuery 将三个XML 文书档案调换为另贰个 XML 文书档案的示范。具体来讲,该示例使用 XQuery
表明式总结示例数据库形式 OE 的 purchaseorder
表中寄放的订单的订单一共,然后为拍卖的种种订单生成了二个 OrderTotal XML
成分。实际上,您能够选取 XSLT
实行相同操作。为此,您首先须求创立贰个应用于 PurchaseOrder XML 文书档案的
XSLT 样式表,以浮动对应的 OrderTotal 成分。对于此示例,能够选用列表 4
中所示的 XSLT 样式表。

列表 4:使用 XSLT 总括小计总和 (Quantity * UnitPrice)

http://www.w3.org/1999/XSL/Transform" version="1.0">



























为低价起见,您或然须求将此 XSL
样式表保存在数据库中,然后再伊始运用它。举例,您能够将样式表作为文件能源保存在
Oracle XML DB
音讯库中。实施该操作的章程之一是将样式表作为文件保留到地点文件系统中,然后采纳以下有个别网络协议将它移动到
XML 音信库:FTP、HTTP 或 WebDAV。借令你已经将列表 4 中的 XSLT 样式表作为
orderTotal.xsl 保存在 /public
音讯库文件夹中,今后能够按以下示例所示将它用作 XMLTransform SQL
函数的参数(假如你以 OE/OE 的身价登陆):

SELECT XMLTRANSFORM(OBJECT_VALUE,
xdbUriType('/public/orderTotal.xsl').getXML()).GetStringVal() AS RESULT FROM
purchaseorder WHERE existsNode(OBJECT_VALUE, 
'/PurchaseOrder[User = "EABEL"]') = 1;

如上查询将管理用户 EABEL 诉求的有所订单(即存款和储蓄在 XMLType 的私下认可PurchaseOrder 表中的订单)并将调换与查询 XMLType 数据部分中的 XQuery
查询同一的出口。

将列表 4 中的 orderTotal XSLT 样式表与查询 XMLType
数据部分中的示例使用的 XQuery 表明式实行比较,您大概会专注到,XQuery
方法要比 XSLT 方法更具吸重力。至少在动用 XQuery
时,您只需编写比相当少的代码就能够获取一致的末尾结果。

查询 HavalSS 新闻提供

由于 瑞虎SS 音讯提供精神上是三个托管的 XML 文件(奥迪Q7SS
音讯阅读器从中获得头条音讯或别的内容),由此能够像管理任何其余能够由此Web 获得的 XML
文书档案那样来拍卖它。正如您在本文前边的询问外界数据源部分中所见,可以动用
XQuery 查询其余能够因此 U大切诺基L 访谈的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全数外界 XML 数据源。以下是二个询问 宝马X5SS
新闻提供的 XQuery 示例:

SELECT XMLQuery(
'for $i in $h//channel
return;

{$i/lastBuildDate}

{for $j in $h//item
where ora:contains($j, "PHP")
return  {($j/title, $j/link)}}

'
PASSING xmlparse (document httpuritype
('http://www.oracle.com/technology/syndication/rss_otn_news.xml').getCLOB()) as "h"
RETURNING CONTENT).getStringVal() as RESULT FROM DUAL;

该 XQuery 应生成一个 XML 文书档案,个中涵盖 Oracle 手艺网 (OTN) 近年来宣布的与
PHP 本领相关的头条音讯列表。所生成的 XML 文书档案也许如下所示:

Tue, 01 Nov 2005 19:37:42 GMT


http://www.oracle.com/technology/xe


http://www.oracle.com/technology/pub/articles/oracle_php_cookbook


http://www.oracle.com/technology/tech/php/zendcore/index.html

但在付出实际应用程序时,您将很或者需求 XQuery 表达式直接生成 HTML
标志,并非单独转移二个如上所示的 XML
文书档案。那样,您便足以创设二个更加灵活、可维护性更加高的应用程序,原因是在这种地方下,全部LacrosseSS 管理(从提取要求的数据到将它包裹在 HTML
标识中)都将转移到数据库。那令你不用编写担任 EnclaveSS
管理的应用程序代码。实际上那象征你不要在诸如 奥迪Q5SS
新闻提供的组织已经转移的动静下修改应用程序代码。相反,您只需修改用于 智跑SS
管理的 XQuery 表明式。

总结

您曾在本文精通到,XQuery
是贰个回顾的查询语言,它提供了一种用于查询、营造和更动 XML
数据的飞速方法。即使 Oracle XQuery 实践使您可以操作任何能够用 XML
表示的多寡(无论它存款和储蓄在数据库中、位于网址上照旧存款和储蓄在文件系统中),但将拍卖的数量移动到数据库中平素是贰个不错的主见。对于数据库中存放的数码,Oracle
XML DB(对 XPath
重写使用同样机制)只可以眼看优化管理那个基于以下数据营造的 XQuery
表明式:那么些数量包蕴关周全据、对象-关周到据或应用结构化(对象-关系)存储才具存款和储蓄的基于
XML 形式的 XMLType 数据。

(网编:铭铭)

原文:Oracle
XQuery查询、构建和转变XML

重临数据库首页

相关文章

admin

网站地图xml地图