但在处理数据库中蕴藏的结构化数据方面,示例情势是表、视图、索引那样的数据库对象的联谊

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 基于示例数据库方式 HENVISION的默许员工涉嫌表中存储的数量打造 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
消息库中创建了一个新文件夹。在该音讯库文件夹中,您随后将积存此处显示的第三个PL/SQL 进程中创建的 XML 文档。首个 PL/SQL 进程首头阵出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周密据创设 XML。对于 XQuery
表明式(XMLQuery 在此地将其用作参数)而言,请小心嵌套的 FLWO劲客表明式中选用的 ora:view XQuery 函数。在该示例中,ora:view
获取三个输入参数,即“H安德拉”和“employees”,它们指示该函数查询属于 HRAV4数据库情势的员工表。因而,ora:view 将赶回一个表示 H昂科威.employees
表行的员工 XML
文档种类。但为了省去结果文档中的空间,只将前多少个职工记录传递给结荚种类。那是经过在
FLWOEnclave 表明式的 where 子句中指定 $i/EMPLOYEE_ID <= 102
而完成的。请留心 FLWOLAND 表明式的 return 子句中动用的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的那八个 XQuery
表明式不仅将 XML
节点值转换为相应的门类,而且还将领到那么些节点值。随后,生成的职工 XML
文档作为 employees.xml 保存到事先在列表 1 中另一个 PL/SQL 进程中创立的
/public/employees XML 音讯库文件夹。要保管此操作已成功,可实施以下查询:

萨姆ple 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方式数据结构图

 www.888000ff.com 1

干什么要将这么些情势命名为SCOTT呢?SCOTT/TIGESportage是Oracle版本1、2和3时期的Oracle数据库的初期用户名/密码组合。SCOTT是指Oracle公司的长者程序员Bruce斯科特。当然,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. 人力资源

人力资源方式,大概H卡宴方式,负责管理部门、雇员、工作以及薪俸音讯。图4-2显示了H途胜方式的详尽数据结构图示。

www.888000ff.com 2

则 XQuery 表明式重临的空种类将与 purchaseorder
表联接,从而包蕴在询问总括果集中。实际上,那意味着输出将不仅涵盖为用户
EABEL 请求的订单生成的 OrderTotal 元素,而且还含有为 purchaseorder
表中储存的享有其余订单生成的空行(默许情状下,purchaseorder 表包括 132
行)。从结果集中清除空行的点子之一是在 SELECT 语句的 WHERE 子句中拔取existsNode SQL 函数,而不是在 XQuery 表达式中使用 WHERE 子句,如下所示:

2. 订单输入

订单输入(Order
Entry)情势,可能OE形式,可以用来管理集团从事商务活动的依次渠道中的客户、销售订单以及产品库存。

图4-3详细描写了OE方式的数据结构。就像是大家此前明白的,与人力资源方式比较,订单输入形式尤其复杂。

www.888000ff.com 3

图4-3 OE格局数据结构

OE形式会记录产品库存。我们将会蕴藏任意指定仓库中指定产品的数额。在店堂中会有四个仓库,所以要运用地方标识符指出其地理区域。在WAREHOUSES表中还有一个Oracle
Spatial列,它为大家提供了动用Oracle Spatial空间技术的钥匙。

Oracle Spatial是在数据库中支持地方数据和地理数据的技艺。

在OE形式中,需求顺便提供提及三个数据库对象模型:

  • CUST_ADDRESS_TYP。那是一个在CUSTOME卡宴S表中动用的目的类型。它富含了广大与客户地址有关的品质。

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。那是一个VA奇骏CHA猎豹CS62(25)的VARAV4RAY。这几个VARubiconRAY在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的引用。

www.888000ff.com 4

图4-4 PM情势数据结构

PRINT_MEDIA表拥有一个目标类型(ADHEADESportage_TYP),以及在表的顺序记录中存储的靶子嵌套表(TEXTDOC_TAB)。

ORDSYS.ORD__列都是一个Intermedia对象类型。这么些Intermedia对象类型不仅能够储存图像、音频、摄像那样的二进制数据;仍能够储存各样与多媒体类型有关的元数据。

SQL> desc ordsys.ordimage;

以上查询与本有的初阶的 XMLTable 示例生成相同的出口。

4. 行列运送

咱俩的虚拟公司想要使用消息系统,以有利于在线客户举行自助订货。当客户开首化订货的时候,系统就需求建立订单,向客户提供账单,并且要力保可以依照客户的职位,通过适当的地面发送订货。

QS_CS形式有一个名为O奔驰M级DERubicon_STATUS_TABLE的表,可以储存订单状态。那是在全方位队列运送情势安装进程中唯一建立表(除了通过高档队列API建立的体系表以外)。大家不会展现与表有关的数据结构图,而是要探究为队列运送形式所创立的系列系统中的新闻流程。

图4-5所示流程图示中得以见到,为了提供一个清晰、直观的订货——发货——结算循环,要在机构时期怎么传递音讯。

www.888000ff.com 5

图4-5 为队列运送(QS)情势在队列系统中创制的音讯流程

漫天都要从图示顶部的订单输入起初。Oracle
Input(订单输入)进度所生成的订单会放入New Order
Queue(新订单队列)中。那些队列要Oracle
Entry应用处理,然后会将订单放到Booked Orders
Queue(登记订单队列)中。再将Booked Orders
Queue中的订单发往适中的运输宗旨(East(西部)、韦斯特(西部)可能Overseas(国外)),以及客户服务单位。

在那时,运送焦点就会吸收要到位的订单,并且向客户发送订货,而且客户服务单位也会发现到订单的意况。在适宜的运载中央,Shipping
Center(运送大旨)应用就会担当发送订货,只怕将预定调整回订单状态。一旦得到了成品,就会发送退回为订单状态的制品,并且将订单放到shipped
orders(已运送订单)队列中。

当订单发送之后,就会经过shipped orders
gueue公告客户服务和客户结算部门,并且向客户发送账单。经过结算的订单会放在比尔ed
Orders(已结算订单)队列中,它会文告客户服务机关,然后就足以成功订单处理进程。

询问 Oracle XML DB 消息库中的 XML 数据

5. 售货历史

以后商务环境中的集团曾经发现,除非人们可以选取一种有意义并且即时的法门,依照音信变更精确的决定报告,否则世界上的所有销售消息都以毫无价值的。决策支持(decision
support)就是用来讲述在开展裁决的经过中消息技术应用的术语。

销售历史形式是一个古板数据仓库的示范。表会依照星型方式(star
schema)设计举行集体,在那种办法下,会有一个大的SALES表位于中央,SALES表的外围还会有一部分小的查询表,或者维数(dimension)表。SALES表日常会有恢宏的数量(所有的销售实时),而维数表相对于SALES表来讲会卓殊小。

图4-6的数据结构图显示了销售历史情势:

www.888000ff.com 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 万分不难直接。它拿走表示信息库文件资源 (UTiguanI) 的字符串并回到该 U凯雷德I
指向的文档。要打听 fn:collection XQuery
函数的功力,同一文件夹中最少应当三个新闻库文件。如若已经运行了列表 1
中的代码,则已经创制了 /public/employees 音信库文件夹并在里头存储了
employees.xml 文件。由此,您将急需在该公文夹中足足再创建一个 XML
文件,然后才能试用 fn:collection。列表 2 中的 PL/SQL 代码基于
SCOTT/TIGELX570 演示数据库情势的 dept 和 emp 表存储的关周密据创设XML,然后将转移的 XML 文档作为 acc_dept.xml 保存到 /public/employees
消息库文件夹。要运行列表 2 中的 PL/SQL 进程,请确保以 SCOTT/TIGE讴歌MDX的地点登录。

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 将 DEPA本田UR-VTMENT
用作根元素。要化解此题材,能够通过 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
文件,以便可以经过以下 USportageL 访问 empsbonus.xml 文件:

http://localhost/employees/empsbonus.xml

接下去,如若您要求基于 empsbonus.xml
文档中贮存的数据创设一个表格。在该报表中,您只怕不仅仅要含有列表中显得的奖金数目以及各种职工的职工
ID,还要包罗他/她的全名。由此,可以率先利用以下查询生成一个新的 XML
文档(若是你以 HRAV4/H奔驰M级 的身份连接):

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()www.888000ff.com, 函数借助于
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
时,您只需编写很少的代码即可拿到同样的终极结出。

询问 MuranoSS 音信提供

出于 GL450SS 新闻提供精神上是一个托管的 XML 文件(LANDSS
消息阅读器从中拿到头条信息或其余内容),因而得以像处理任何其余可以透过
Web 得到的 XML
文档那样来拍卖它。正如您在本文前面的询问外部数据源部分中所见,可以运用
XQuery 查询其余可以经过 ULANDL 访问的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定所有外部 XML 数据源。以下是一个询问 悍马H2SS
音信提供的 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
文档。那样,您便能够创设一个更灵活、可维护性更高的应用程序,原因是在那种状态下,所有
CR-VSS 处理(从提取须要的数目到将它包裹在 HTML
标记中)都将更换来数据库。那使你不用编写负责 冠道SS
处理的应用程序代码。实际上那表示你不要在比如 中华VSS
信息提供的结构已经变更的图景下修改应用程序代码。相反,您只需修改用于 奥迪Q7SS
处理的 XQuery 表明式。

总结

你已经在本文通晓到,XQuery
是一个归咎的询问语言,它提供了一种用于查询、营造和转移 XML
数据的立即方法。即便 Oracle XQuery 实施使您可以操作任何能够用 XML
表示的数量(无论它存储在数据库中、位于网站上仍旧存储在文件系统中),但将拍卖的数码移动到数据库中始终是一个不利的意见。对于数据库中储存的多少,Oracle
XML DB(对 XPath
重写使用相同机制)只可以眼看优化处理那多少个基于以下数据营造的 XQuery
表达式:这几个数据包蕴关周密据、对象-关全面据或选用结构化(对象-关系)存储技术存储的根据XML 方式的 XMLType 数据。

(权利编辑:铭铭)

原文:Oracle
XQuery查询、创设和转换XML

回到数据库首页