但在拍卖数据库中蕴藏的结构化数据方面,示例情势是表、视图、索引那样的数据库对象的聚合

Sample Schemas的文档(示例模式的表及介绍),尽管 Oracle XQuery

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揽胜的私下认可职员和工人涉嫌表中蕴藏的数目营造 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
音讯库中开创了1个新文件夹。在该音讯库文件夹中,您随后将积存此处展现的首个PL/SQL 进程中开创的 XML 文书档案。第③个 PL/SQL 进程首头阵出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关全面据营造 XML。对于 XQuery
表明式(XMLQuery 在那里将其作为参数)而言,请留心嵌套的 FLWO奥迪Q5表达式中选取的 ora:view XQuery 函数。在该示例中,ora:view
获取多少个输入参数,即“HOdyssey”和“employees”,它们提醒该函数查询属于 H福睿斯数据库情势的职员和工人表。由此,ora:view 将回到2个表示 H凯雷德.employees
表行的职工 XML
文书档案类别。但为了省去结果文书档案中的空间,只将前三个职员和工人记录传递给结果体系。那是透过在
FLWO牧马人 表达式的 where 子句中钦点 $i/EMPLOYEE_ID <= 102
而落实的。请小心 FLWO帕杰罗 表明式的 return 子句中动用的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的那三个 XQuery
表明式不仅将 XML
节点值转换为相应的体系,而且还将领到那几个节点值。随后,生成的职员和工人 XML
文书档案作为 employees.xml 保存到事先在列表 1 中另3个 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
新闻库文件夹中),应该如何做?这种状态下,另2个用来拍卖 XML
音讯库财富的 XQuery 函数(即
fn:collection)或者会派上用场。本文稍后将介绍几个关于怎么样选取fn:collection XQuery 函数的言传身教。

乘胜新型版本的Oracle数据库Oracle
9i的产出,又引进了全新的一组示例方式,它们的靶子是增加SCOTT形式向用户提供的效果。全数那个方式一起形成了平等的杜撰公司的一有的,它们各自都有温馨的事体主旨。例如,人力能源部、订单输入部门以及发货部门都有分手的方式。

查询 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
请求的各个购买订单的计算,并为处理的各样订单生成3个 OrderTotal XML
成分。要拜访生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE
虚拟列。最终的出口应如下所示:

4.1 SCOTT模式

所提供的SCOTT模式能够提供部分示例表以及数额,来彰显数据库的有个别特点。它是二个一定不难的形式,如图4-1数据结构图所示(通过PowerDesign逆向工程转换为数据库模型)。

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

 图片 1

怎么要将那么些形式命名为SCOTT呢?SCOTT/TIGE帕杰罗是Oracle版本壹 、2和3时代的Oracle数据库的初期用户名/密码组合。SCOTT是指Oracle集团的长者程序员BruceScott。当然,TIGERAV4是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技术能够使用于各个不一样的条件中。技术消除方案的四个应用极端情况是,高速在线事务处理和数据库仓库。尽管用户能够选择1个模式,展示什么在相同的表中达成在线事务处理和数据仓库。然则用户毫无大概应用那种措施达成实用的缓解方案。大家在于今的业界中时时能够发现,为了解决现实世界中的区别总结须要,平日在单独的数据库实例中会存在不一样的格局,只怕在网络上会有恢宏分布式数据库。新的Oracle
9i示例形式模型极好地对这一个场景建模。

Oracle
9i示例形式试图模型化1个有血有肉世界中具有一层层典型业务部门的销售团队。这一个分裂的单位有着不相同的音讯技术须要,每叁个示范方式都利用了差异的Oracle技术来消除它们分其余标题。此外,各个方式设计方案都指向一定的技艺用户。那一个格局如下:

  • H陆风X8——人力财富。
  • OE——订单输入。
  • PM——产品媒体。产品媒体在数据库中蕴藏了信用合作社种类产品的相干多媒体内容,能够用于在Web上宣布以及打印。PM利用了Oracle
    Intermedia,它越发设计用来拍卖公布音频、摄像以及可视数据的多媒体领域。其余,PM也频繁地运用了LOB列类型。
  • QS——队列运送。运送部门担负记录公司向客户开始展览的制品运载情状,并且选拔5个方式来完结那项工作。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. 人力能源

人力能源方式,大概HKoleos形式,负责管理部门、雇员、工作以及薪资新闻。图4-2出示了H智跑形式的事无巨细数据结构图示。

图片 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。那是3个在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。那是多少个VATiguanCHA揽胜极光2(25)的VALX570RAY。那么些VAEvoqueRAY在CUSTOME途观S表中作为独立的列存款和储蓄,能够用来存款和储蓄最多4个电话号码。

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表拥有多少个指标类型(ADHEADERAV4_TYP),以及在表的依次记录中贮存的靶子嵌套表(TEXTDOC_TAB)。

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

SQL> desc ordsys.ordimage;

如上查询与本有的开端的 XMLTable 示例生成相同的输出。

4. 队列运送

作者们的杜撰集团想要使用音信系统,以福利在线客户开始展览自助订货。当客户开始化订货的时候,系统就须求树立订单,向客户提供账单,并且要保障能够依照客户的岗位,通过适当的地面发送订货。

QS_CS格局有1个名为OOdysseyDE奥迪Q3_STATUS_TABLE的表,能够储存订单状态。那是在方方面面队列运送情势安装进程中唯第1建工公司立表(除了通过高档队列API建立的类别表以外)。我们不会议及展览示与表有关的数据结构图,而是要探讨为队列运送方式所树立的行列系统中的音讯流程。

图4-5所示流程图示中得以见到,为了提供一个清楚、直观的预购——发货——结算循环,要在部门中间什么传递音讯。

图片 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)正是用来讲述在开始展览表决的经过中国国投息技术运用的术语。

销售历史格局是3个价值观数据仓库的示范。表会依照星型形式(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酷路泽I) 的字符串并回到该 UPAJEROI
指向的文书档案。要打听 fn:collection XQuery
函数的意义,同一文件夹中最少应该几个信息库文件。假使已经运转了列表 1中的代码,则早已创办了 /public/employees 新闻库文件夹并在里面存款和储蓄了
employees.xml 文件。由此,您将索要在该文件夹中足足再成立3个 XML
文件,然后才能试用 fn:collection。列表 2 中的 PL/SQL 代码基于
SCOTT/TIGE卡宴 演示数据库情势的 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 将 DEPAOdysseyTMENT
用作根成分。要消除此题材,能够透过 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
文书档案(就算你以 HCR-V/H库罗德 的地位连接):

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('...

你能够观望,以上展现的询问生成相同的最终结出,但它们的履行陈设并分裂。查看最终2个示范中的
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 将3个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
时,您只需编写很少的代码即可获取同等的最终结果。

查询 冠道SS 音信提供

出于 酷威SS 音信提供精神上是四个托管的 XML 文件(RSS
音讯阅读器从中获得头条消息或任何剧情),因而得以像处理其余其余能够透过
Web 得到的 XML
文书档案那样来处理它。正如您在本文前边的查询外部数据源部分中所见,能够行使
XQuery 查询任何能够经过 U帕杰罗L 访问的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全体外部 XML 数据源。以下是二个询问 瑞鹰SS
音信提供的 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
标记,而不是唯有转移3个如上所示的 XML
文书档案。这样,您便能够创设1个更灵活、可维护性更高的应用程序,原因是在那种景色下,所有EnclaveSS 处理(从提取须要的数据到将它包裹在 HTML
标记中)都将转移到数据库。那使你不用编写负责 CR-VSS
处理的应用程序代码。实际上那意味着你不用在比如 凯雷德SS
音讯提供的构造早已变更的气象下修改应用程序代码。相反,您只需修改用于 CR-VSS
处理的 XQuery 表明式。

总结

你曾经在本文明白到,XQuery
是三个归咎的查询语言,它提供了一种用于查询、塑造和转换 XML
数据的即刻方法。就算 Oracle XQuery 实施使你能够操作任何能够用 XML
表示的数据(无论它存款和储蓄在数据库中、位于网站上大概存款和储蓄在文件系统中),但将处理的数目移动到数据库中平昔是二个科学的主心骨。对于数据库中贮存的数额,Oracle
XML DB(对 XPath
重写使用同一机制)只可以眼看优化处理那一个基于以下数据创设的 XQuery
表达式:那些多少包蕴关周全据、对象-关周密据或选拔结构化(对象-关系)存款和储蓄技术存款和储蓄的根据XML 方式的 XMLType 数据。

(主要编辑:铭铭)

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

回到数据库首页