示范形式是表、视图、索引那样的数据库对象的聚集,但在拍卖数据库中储存的结构化数据方面

 

如上查询是二个有关怎么样选拔 XQuery 基于 XML 和非 XML
数据(以差异的方法从分歧的数额源中检索)生成 XML
文书档案的演示。具体而言,使用 ora:view() 函数访问 HR 演示格局中的暗中同意
employees 关系表,并使用 PASSING 子句中的 httpuritype() 函数借助于
HTTP 访问 empsbonus.xml 文书档案。然后,在 FLWOR 表明式的 return
子句中构建新的 XML 文书档案。最终,将收获以下 XML 文书档案:

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

接下去,假如您要求依照 empsbonus.xml
文档中蕴藏的数码创制一个报表。在该报表中,您或者非但要包涵列表中显得的奖金多少以及种种职员和工人的职工
ID,还要包罗他/她的真名。因而,可以率先采纳以下查询生成一个新的 XML
文书档案(要是你以 H福特Explorer/HGL450 的地位连接):

4.3 小结

小说依照本人知道浓缩,仅供参考。

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

在上述示例中,您在 XMLTable 函数的 PASSING 子句中利用 OBJECT_VALUE
虚拟列将 purchaseorder 表作为左右文项传递给此间使用的 XQuery
表明式。XQuery 表明式总计用户 EABEL
请求的各样购买订单的计算,并为处理的各个订单生成三个 OrderTotal XML
成分。要访问生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE
虚拟列。最终的出口应如下所示:

4.1 SCOTT模式

所提供的SCOTT形式能够提供部分示例表以及数额,来展现数据库的有的特点。它是3个一定容易的形式,如图肆-壹数据结构图所示(通过PowerDesign逆向工程转换为数据库模型)。

图四-1 SCOTT情势数据结构图

 图片 1

为什么要将以此格局命名称叫SCOTT呢?SCOTT/TIGEXC90是Oracle版本一、二和三时代的Oracle数据库的初期用户名/密码组合。SCOTT是指Oracle企业的长者程序员Bruce司各脱。当然,TIGE翼虎是Bruce养的猫的名字。

SCOTT形式中所呈现的数据库天性凉时被认为是绝超过1/二关周详据库产品中的主要特色。假诺想要真实地显示Oracle数据库的效益,就要强化这么些示例!

若是应用程序处理关周详据而非 XML,而你必要拜访的数码以 XML
格式存款和储蓄,则将 XML
分解为关全面据恐怕会11分管用。继续进行上部分的以身作则,您能够行使 SQL
函数 XMLTable 将员工 XML 成分分解为虚拟表的单个列,如下所示:

乘机新型版本的Oracle数据库Oracle
玖i的面世,又引进了全新的壹组示例格局,它们的对象是扩徐熙媛(Barbie Hsu)(Barbie Hsu)COTT情势向用户提供的机能。全体那几个形式1起形成了相同的杜撰公司的一有个别,它们各自都有投机的业务大旨。例如,人力能源部、订单输入部门以及发货部门都有分手的形式。

总结

可依照本人索要实行询问,包蕴了累累的文书档案。

如上查询将处理用户 EABEL 请求的持有订单(即存款和储蓄在 XMLType 的默认PurchaseOrder 表中的订单)并将转变与查询 XMLType 数据部分中的 XQuery
查询同壹的输出。

四.贰 Oracle 九i示例情势

Oracle技术能够采纳于种种分化的条件中。技术化解方案的五个利用极端情状是,高速在线事务处理和数据库仓库。即便用户能够利用3个方式,呈现什么在平等的表中实现在线事务处理和数据仓库。可是用户毫无恐怕使用那种艺术达成实用的化解方案。大家在当今的产业界中不时能够窥见,为了缓解具体世界中的差别总括需要,日常在单独的数据库实例中会存在差别的形式,或许在互联网上会有多量分布式数据库。新的Oracle
九i示例情势模型极好地对那些场地建立模型。

Oracle
九i示例形式试图模型化一个现实世界中持有1俯十皆是典型业务部门的销售团队。这么些分裂的单位有着不相同的音信技术必要,每三个示范格局都施用了分裂的Oracle技术来缓解它们各自的难题。此外,每一种格局设计方案都针对特定的技巧用户。那么些情势如下:

  • HENVISION——人力财富。
  • OE——订单输入。
  • PM——产品媒体。产品媒体在数据库中储存了铺面体系产品的有关多媒体内容,能够用来在Web上揭露以及打印。PM利用了Oracle
    Intermedia,它特别布署用来拍卖公布音频、摄像以及可视数据的多媒体领域。别的,PM也反复地运用了LOB列类型。
  • QS——队列运送。运送部门担负记录企业向客户拓展的成品运载意况,并且利用七个方式来完毕那项工作。QS、QS_ES、QS_WS、QS_OS、QS_CB和QS_CS构成了队列运送情势的集结。
  • SH——销售历史。

所选择的储存模型并非是影响 XQuery
表达式执行品质的绝无仅有要素。在一些意况下,XQuery
表明式自己的协会也说不定造成品质难点。要监控 XQuery
表明式的质量,能够打字与印刷并检讨关联的 EXPLAIN PLAN。在 SQL*Plus
中,只需安装 AUTOTRACE 系统变量,即可打字与印刷 SQL
优化程序行使的施行路径。但要执行该操作,请确定保证创造 PLUSTRACE
剧中人物,然后将其给予连接到数据库所采用的用户。有关怎么样履行此操作的音信,请参阅
Oracle 数据库 10g 第 二 版 (十.2) 文书档案中《SQL\Plus
用户指南和参照》一书中的“调整
SQL\
Plus”壹章。以下示例演示了什么样通过检查 EXPLAIN PLAN
生成的实践布置来取得利益。借使你已经将 PLUSTRACE 剧中人物赋予暗中同意用户 OE,以
OE/OE 的地点登录并运维以下查询:

二. 自解释格局

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.’;
http://localhost/employees/empsbonus.xml

萨姆ple Schemas的文书档案(示例格局的表及介绍):

则 XQuery 表明式重返的空类别将与 purchaseorder
表联接,从而包涵在查询总计果集中。实际上,那意味着输出将不仅仅涵盖为用户
EABEL 请求的订单生成的 OrderTotal 成分,而且还富含为 purchaseorder
表中蕴藏的持有其余订单生成的空行(默许景况下,purchaseorder 表包罗 132行)。从结果集中拔除空行的点子之壹是在 SELECT 语句的 WHERE 子句中动用
existsNode SQL 函数,而不是在 XQuery 表达式中选择 WHERE 子句,如下所示:

Sample Schemas的目录:

那将转变以下输出:

5. 售货历史

现今商务条件中的集团曾经发现,除非人们能够运用壹种有含义并且即时的章程,依照新闻变化精确的裁定报告,不然世界上的保有销售音信都以毫无价值的。决策帮忙(decision
support)正是用来描述在进展决策的进程中国国投息技术运用的术语。

销售历史情势是1个价值观数据仓库的言传身教。表会依照椭圆形形式(star
schema)设计开始展览公司,在那种方法下,会有一个大的SALES表位于主旨,SALES表的外界还会有局地小的查询表,大概维数(dimension)表。SALES表常常会有雅量的数码(全部的行销实时),而维数表相对于SALES表来讲会非常的小。

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

图片 2

图四-6 销售历史格局数据结构

由于 奥迪Q伍SS 新闻提供精神上是三个托管的 XML 文件(景逸SUVSS
消息阅读器从中获得头条新闻或其余内容),因而能够像处理其余别的能够因而Web 获得的 XML
文书档案那样来拍卖它。正如你在本文前边的询问外部数据源部分中所见,能够行使
XQuery 查询其余能够透过 UTucsonL 访问的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全部外部 XML 数据源。以下是1个查询 昂科拉SS
音信提供的 XQuery 示例:

4.2.三 发现更加多关于示例情势的始末

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

诸多年来,Oracle教师、管理员、程序员、以及用户为了学习、测试或调整他们的数据库,都一直在接纳这几个值得依靠的SCOTT形式开始展览着容易地询问、更新、以及去除操作。这一个形式就是我们所说的言传身教方式。示例情势是表、视图、索引那样的数据库对象的聚众,并且随着预先供了代表小圈圈仍然中等规模公司的数额。

将 XML 分解为关周密据

注意:

您或然对为上述查询生成的实施布置并不满足。特别是,所处理的行数或者特别大。由于
SQL
调整的基本点对象是制止访问对结果尚未其他影响的行,由此恐怕要继承调整查询以优化品质。对查询中蕴藏的
XPath 表明式进行双重建立模型后,能够再一次重试它,如下所示:

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行。

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

再次来到数据库首页

四.二.2 渐进学习格局

遵照差异的受众协会方式的办法得以鼓励新的Oracle用户通过结构化的点子学习技能。例如,初学者能够从人力能源起始。那能够让她熟谙关系概念、查询数据、数据库操作语言、数据库定义语言、以及1些别的基本概念。

当新Oracle用户了然了人力财富方式之后,能够再三再四分析订单输入形式。在这几个新格局中,他将会遇见对象类型、XML协理、Oracle
Spatial、以及任何一些较为高档的数据库性情。

接下去,用户能够分析任何方式所提供的特定领域。多媒体育专科高校家可以深深学习产品媒人体模型式。设计算与发放表-订阅型基于音讯的系统的用户能够窥见,队列运送形式在她们先导上学Oracle高级队列的时候将会那多少个有帮衬。数据仓库的热衷者最棒去分析和询问销售历史情势。

另1种能够肯定拉长 XQuery
表明式执行质量的技术是采纳绑定动态变量。使用绑定变量(而不是将变量串联为字符串)能够使
Oracle 重用 SQL 语句,从而收缩分析开支并强烈增加应用程序的本性。能够在
XMLQuery 和 XMLTable SQL 函数中运用 PASSING 子句将动态变量绑定到 XQuery
表明式。该技能使您能够根据客户端代码中计算的参数动态生成 XML。列表 3中的示例演示了什么样在从 PHP 脚本执行的 XQuery 查询中使用绑定变量。

三. 出品媒体

出品媒体(Product
Media)方式,或然PM方式,用于管理描述集团出品的多媒体数据。录制、音频和图像那样的在线媒体都足以随输出的媒体数据类型存款和储蓄在数据库中。那是大家要专门商量的形式之一,它器重于多媒体内容,以及Oracle
Intermedia所提供的意义。

注意:

Oracle Intermedia是Oracle数据库扶助多媒体内容类型的零件。

而外Intermedia数据存款和储蓄以外,PM情势还特别正视LOB列类型的施用来囤积数据。

出品媒人体模型式是Oracle 九i使用名称为Oracle
Intermedia的Oracle技术化解实际世界商务供给的精美示例。例如,大家虚构的商行就足以储存多媒体数据大概输出多媒体数据。由此,产品媒人体模型式中的示例可以成功如下工作:

  • 为Oracle中使用Web公布的剧情存款和储蓄缩略图和完全尺寸的图像。
  • 在Oracle中储存音频剪辑。
  • 在Oracle中存款和储蓄摄像剪辑。
  • 对图像类型举行拍卖,以便转换来与Web包容的图像类型

选拔Oracle
Intermedia,1些已经很难达成的职分就变得相对简便易行。图4-四象征为产品媒人体模型式,以及它对订单输入表PRODUCT_INFORMATION的引用。

图片 3

图四-④ PM形式数据结构

PRINT_MEDIA表拥有多少个目的类型(ADHEADELAND_TYP),以及在表的各类记录中存款和储蓄的目的嵌套表(TEXTDOC_TAB)。

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

SQL> desc ordsys.ordimage;

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

现阶段hr已经锁定了(即lock)。需求进行以下脚本:

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

Oracle 玖i产品支持文书档案:

列表 四:使用 XSLT 总结小计总和 (Quantity * UnitPrice)

 

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

四. 行列运送

我们的虚拟公司想要使用音信系统,以有益在线客户拓展自助订货。当客户伊始化订货的时候,系统就必要建立订单,向客户提供账单,并且要保险能够依据客户的岗位,通过适当的地带发送订货。

QS_CS形式有三个名称叫O昂CoraDE安德拉_STATUS_TABLE的表,能够储存订单状态。那是在方方面面队列运送格局安装进程中绝无仅有建立表(除了通过高档队列API建立的行列表以外)。我们不会显得与表有关的数据结构图,而是要钻探为队列运送情势所树立的系列系统中的音讯流程。

图肆-5所示流程图示中得以见到,为了提供3个清晰、直观的预购——发货——结算循环,要在机构时期怎么传递消息。

图片 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通告客户服务和客户结算部门,并且向客户发送账单。经过结算的订单会放在Billed
Orders(已结算订单)队列中,它会打招呼客户服务部门,然后就足以做到订单处理进程。

正如您从日前的壹些中打听到的,XQuery 是壹种用于查询 Oracle 数据仓库储存款和储蓄的
XML 内容的迅猛方法 – 无论你是拍卖地点存款和储蓄的 XMLType
数据或许查询基于关全面据营造的 XML
视图。但听说对数据应用的积存类型的不等,XQuery
表达式的执行品质只怕截然不相同差别。特别是,Oracle XML DB 可以优化基于由
ora:view 函数成立的 SQL/XML 视图而营造的 XQuery 表达式。对于 XMLType
表或列中蕴藏的 XML 数据,只可以对利用结构化(对象-关系)存款和储蓄技术存款和储蓄的依照XML 格局的 XMLType 数据举行 XQuery 优化。

4.二.1 深切商量各样方式

即使 Oracle 在 Oracle XML DB 中提供了2个自带 XSLT
处理器,但在很多动静下(特别是在拍卖大型文书档案时),XQuery 对于创设 XML
更飞快。其余,XQuery 表达式日常比为同一作业设计的 XSLT
样式表更具可读性,并且更精晓。与 XSLT 一样,XQuery 不但可用来将一个 XML
文书档案转换为另三个 XML 文档,而且还可用以将 XML
转换为另一种基于文本的格式,如 HTML 或 WML。

1. 人力财富

人力能源情势,或许H福睿斯方式,负责管理部门、雇员、工作以及报酬音信。图4-二出示了HRAV四形式的详细数据结构图示。

图片 5

为访问 Oracle XML DB 消息库中贮存的 XML 数据,Oracle XQuery 引入了
fn:doc 和 fn:collection XQuery 函数。使用 fn:doc,您能够查询 XML
音讯库中蕴藏的单个 XML 文书档案,而 fn:collection
使你能够访问同一新闻库文件夹中贮存的三个 XML 文书档案。

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

XQuery 与 XSLT

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

列表 3 中显得的脚本应生成以下输出(注意,浏览器中恐怕不会来得标记):

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
ORDERTOTAL
-------------------------------------------------------------

EABEL-20021009123338324PDT
1328.05


EABEL-20021009123335791PDT
2067.15


EABEL-20021009123336251PDT
289.6


EABEL-20021009123336382PDT
928.92

 

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;

二. 订单输入

订单输入(Order
Entry)格局,恐怕OE格局,能够用来管理公司从事商务活动的逐条渠道中的客户、销售订单以及产品仓库储存。

图肆-三详细描写了OE形式的数据结构。就好像笔者辈原先精晓的,与人力财富方式相比较,订单输入情势特别复杂。

图片 6

图肆-三 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酷威CHATiguan二(二5)的VALacrosseRAY。那些VA卡宴RAY在CUSTOME奥迪Q三S表中作为单身的列存款和储蓄,能够用于存储最多八个电话号码。

SQL> desc phone_list_typ;

phone_list_typ VARRAY(5) OF VARCHAR2(25)

OE格局是一个很好的以身作则,它显得了专业的供应组织或许电脑零售商店能够动用什么办法去管理它们完整订单处理进程。通过使用订单输入表中的数量,销售团队就足以向地下的客户提供规范的出品音信,接受销售订单,量化订单收入,存款和储蓄客户新闻,为差异地理地点订购产品的客户提供准确的仓库储存音讯,以及别的服务。

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;

正如你从如今的示范中打听到的,在 Oracle XQuery 实施中,doc 和 collection
XQuery 函数用于访问 Oracle XML DB 音信库中存款和储蓄的 XML 文档。可以透过
XMLTable 和 XMLQuery SQL 函数中的 PASSING
子句动态绑定外部数据源。怀恋以下示例。若是你的信用合作社要为那多少个从事于 XQ
项指标职员和工人付出奖金。由此,财务部发表了 empsbonus.xml
文件,当中带有有身份获得奖金的职员和工人列表以及该列表中输入的各样职工的奖金多少。empsbonus.xml
文件可能如下所示:

XQuery 使你能够操作基于 XML
形式以及非基于形式的数据。以下示例演示了怎么着使用 XMLTable 函数从 OE
演示数据库方式中询问基于 PurchaseOrder XML 形式的 XMLType 表。

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 文书档案,个中包含 Oracle 技术网 (OTN) 近日颁发的与
PHP 技术有关的头条信息列表。所生成的 XML 文书档案也许如下所示:

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

(主要编辑:铭铭)


100
King
24000


101
Kochhar
17000


102
De Haan
17000

该查询将转变以下输出:

列表 二:基于关周密据营造 XML 并将其保存到 XML 音讯库

您能够见到,以上彰显的查询生成相同的尾声结出,但它们的履行安排并分歧。查看最后三个示范中的
XQuery 表明式,您或者会小心到它迭代顶层 PurchaseOrder 成分,在那之中的每一种PurchaseOrder 元素都代表依据 PurchaseOrder XMLType
格局的表中的一行。那象征实际上海重机厂写 XQuery
表明式,以迭带基础对象表(用于存储分解的 PurchaseOrder
文书档案)中的行。与查询要迭代不表示基础表中的单个行的 XML
成分相比较,该措施的性质更好有的。

利用 XQuery,能够依照 XML 数据以及能够用 XML 表示的非 XML 数据生成 XML
文书档案,无论其岗位怎么:无论是存款和储蓄在数据库中、置于网址上、即时创设大概存款和储蓄在文件系统中。但要注意,Oracle
XML DB 为针对数据库中蕴藏的数目开始展览的 XML
操作提供了要命高的质量和可伸缩性。因而,倘若你可以统统控制所处理的数额,则最棒将它移动到数据库中。

该查询应生成以下输出:

要赢得壹致的末梢结出,能够改用 XMLQuery 函数。但借使将上贰个示范中利用的
XQuery 表明式参数传递给 XMLQuery(如下所示):

根据关全面据营造 XML

但在少数情状下,很难发现 XQuery
表达式的哪位构造将使1些查询的天性更好。这就是干吗最棒在开发阶段使用调整工具的来由。

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

您能够看到,以上输出包涵从 employees.xml 和 acc_dept.xml 中取得的职工
XML 元素,那个要素表示薪资大于或等于 5,000 英镑的职工。

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;
//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;
?>
SELECT XMLTRANSFORM(OBJECT_VALUE,
xdbUriType('/public/orderTotal.xsl').getXML()).GetStringVal() AS RESULT FROM
purchaseorder WHERE existsNode(OBJECT_VALUE, 
'/PurchaseOrder[User = "EABEL"]') = 1;

该组织应生成以下输出:

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;
/

100
Steven King
1200


101
Neena Kochhar
1000

那儿,/public/employees
新闻库文件夹应涵盖多个公文:acc_dept.xml(由列表 2 中的 PL/SQL
代码生成)和 employees.xml 文件(由列表 壹 中的代码生成)。由于那么些 XML
文档存款和储蓄在同样消息库文件夹中,因而得以应用 fn:collection 函数访问三个XML 文书档案中存储的职工音讯。但是,固然这么些 XML 文书档案均包罗职员和工人 XML
成分(那一个要素实际上具有同样结构),但 XML 文书档案本身的构造迥然区别。在
employees.xml 中,文书档案根成分为 EMPLOYEES,而 acc_dept.xml 将 DEPA奥迪Q7TMENT
用作根成分。要消除此题材,可以通过 XQuery 使用 XPath // 构造,从而导航到
XML 文档中的某些节点,而不要钦命该节点的伏贴路径。以下示例演示了怎么在
XQuery 表明式中选取 XPath // 构造:

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



























但在支付实际应用程序时,您将很可能要求 XQuery 表达式直接生成 HTML
标记,而不是不过转移2个如上所示的 XML
文书档案。那样,您便可以创设一个更灵敏、可维护性更高的应用程序,原因是在那种情景下,全部奇骏SS 处理(从提取要求的数目到将它包裹在 HTML
标记中)都将更换来数据库。那使你不要编写负责 福睿斯SS
处理的应用程序代码。实际上那表示你不用在比如 PAJEROSS
消息提供的构造早已变更的景况下修改应用程序代码。相反,您只需修改用于 RAV四SS
处理的 XQuery 表明式。

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

为便利起见,您可能必要将此 XSL
样式表保存在数据库中,然后再起来运用它。例如,您能够将样式表作为文件财富保存在
Oracle XML DB
音信库中。执行该操作的格局之一是将样式表作为文件保留到地面文件系统中,然后利用以下有些互连网球组织议将它移动到
XML 新闻库:FTP、HTTP 或 WebDAV。要是你曾经将列表 四 中的 XSLT 样式表作为
orderTotal.xsl 保存在 /public
音讯库文件夹中,现在能够按以下示例所示将它用作 XMLTransform SQL
函数的参数(假若你以 OE/OE 的身价登录):

在本文后面包车型客车询问 XMLType 数据部分中,您收看了二个关于使用 XQuery 将2个XML 文书档案转换为另一个 XML 文书档案的言传身教。具体而言,该示例使用 XQuery
表达式计算示例数据库方式 OE 的 purchaseorder
表中蕴藏的订单的订单壹共,然后为拍卖的种种订单生成了三个 OrderTotal XML
成分。实际上,您能够行使 XSLT
执行同样操作。为此,您首先要求成立一个用到于 PurchaseOrder XML 文书档案的
XSLT 样式表,以变化对应的 OrderTotal 成分。对于此示例,可以使用列表 四中所示的 XSLT 样式表。

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;
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;
/

您曾经在本文理解到,XQuery
是五个总结的查询语言,它提供了1种用于查询、营造和转换 XML
数据的全速方法。固然 Oracle XQuery 实施使您能够操作任何能够用 XML
表示的多少(无论它存款和储蓄在数据库中、位于网站上仍然存款和储蓄在文件系统中),但将处理的数据移动到数据库中平素是一个正确的主意。对于数据库中蕴藏的数量,Oracle
XML DB(对 XPath
重写使用同一机制)只好眼看优化处理这一个基于以下数据创设的 XQuery
表明式:这几个多少包含关周全据、对象-关周全据或选拔结构化(对象-关系)存储技术存款和储蓄的根据XML 形式的 XMLType 数据。

在 Oracle 数据库 10g 第 2 版中,Oracle
引入了2个与该数据库集成的全职能自带 XQuery
引擎,该引擎可用来完毕与费用辅助 XML 的应用程序相关的各类职分。XQuery
是一种用于拍卖 XML 数据模型的询问语言,它实在可操作任何项目标可用 XML
表明的多寡。纵然 Oracle XQuery
实施使你能够选取数据库数据和外部数据源,但在拍卖数据库中储存的结构化数据方面,Oracle
XML DB 平常能够明显加强品质。

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;

询问 Oracle XML DB 音讯库中的 XML 数据

将列表 四 中的 orderTotal XSLT 样式表与查询 XMLType
数据部分中的示例使用的 XQuery 表明式进行相比较,您或然会小心到,XQuery
方法要比 XSLT 方法更具吸重力。至少在行使 XQuery
时,您只需编写很少的代码即可获得一致的末段结出。

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

查询 XMLType 数据

查询外部数据源

查询 福睿斯SS 消息提供

在要求的气象下(例如,向 Web 服务发送结果),您或者要依照关周详据构建XML。要在 Oracle 数据库 拾g 第 贰版在此之前的版本中形成此职务,日常须要选取 SQL/XML 生成函数,如
XMLElement、XMLForest 和 XMLAgg()。在 Oracle 数据库 10 g 第 2版中,XQuery 将比这么些函数更为赶快。具体而言,在 XQuery 表明式内部选用ora:view XQuery 函数,您能够查询现有的涉及表或视图以及当时构建XML,从而无需经过关周详据显式创制 XML 视图。列表 1 中的 PL/SQL
代码演示了如何行使 ora:view 基于示例数据库格局 H奥德赛的默许职员和工人涉嫌表中储存的数码创设 XML 文书档案。

100
SKING
AD_PRES

正如本文在此以前(参阅使用关周到据营造 XML部分)介绍的言传身教所示范,使用
fn:doc 相当不难间接。它拿走表示音讯库文件财富 (U奇骏I) 的字符串并再次回到该 U福特ExplorerI
指向的文书档案。要询问 fn:collection XQuery
函数的成效,同一文件夹中足足应该三个音信库文件。假设已经运转了列表 1中的代码,则已经创办了 /public/employees 音信库文件夹并在里边蕴藏了
employees.xml 文件。因而,您将急需在该文件夹中至少再创立1个 XML
文件,然后才能试用 fn:collection。列表 二 中的 PL/SQL 代码基于
SCOTT/TIGE昂科拉 演示数据库格局的 dept 和 emp 表存款和储蓄的关全面据营造XML,然后将转变的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees
消息库文件夹。要运维列表 二 中的 PL/SQL 进程,请保管以 SCOTT/TIGE凯雷德的地方登录。

100
1200


101
1000

正文提供的以身作则不仅示范了在怎么地方下以及如何采纳 XQuery 查询、塑造和转移
XML,而且还演示了何等监督和分析 XQuery
表达式的习性执行,从而找到更高速的法子来处理同1工作负荷。

消除质量难题

列表 三:使用绑定变量

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('...
EMPNO ENAME SAL
----- -------------- ----------
7839 KING 5000
100 King 24000
101 Kochhar 17000
102 De Haan 17000
102
De Haan
17000


7839
KING
5000


100
King
24000


101
Kochhar
17000

在列表 1 中的第三个 PL/SQL 进程中,您只是在 XML
新闻库中开创了二个新文件夹。在该音讯库文件夹中,您随后将积存此处呈现的第3个PL/SQL 进程中开创的 XML 文书档案。第三个 PL/SQL 进程首首发出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周到据营造 XML。对于 XQuery
表明式(XMLQuery 在此地将其看做参数)而言,请小心嵌套的 FLWO汉兰达表明式中动用的 ora:view XQuery 函数。在该示例中,ora:view
获取多个输入参数,即“HLacrosse”和“employees”,它们指示该函数查询属于 HLAND数据库格局的职员和工人表。因而,ora:view 将赶回贰个象征 HSportage.employees
表行的职工 XML
文书档案连串。但为了节省结果文档中的空间,只将前多个职工记录传递给结果类别。那是经过在
FLWO奥德赛 表明式的 where 子句中钦命 $i/EMPLOYEE_ID <= 102
而落到实处的。请小心 FLWO奔驰M级 表达式的 return 子句中采用的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的那五个 XQuery
表明式不仅将 XML
节点值转换为对应的门类,而且还将提取那么些节点值。随后,生成的员工 XML
文书档案作为 employees.xml 保存到事先在列表 1 中另2个 PL/SQL 进程中成立的
/public/employees XML 音讯库文件夹。要确认保障此操作已形成,可进行以下查询:

在上述 XQuery 中,fn:doc XQuery 函数用于访问 Oracle XML DB
音信库中存款和储蓄的单个 XML 文书档案。但只要要处理局部享有同等或相似结构的 XML
文书档案(存款和储蓄在同一 XML
音信库文件夹中),应该怎么办?那种场所下,另叁个用以拍卖 XML
音信库能源的 XQuery 函数(即
fn:collection)也许会派上用场。本文稍后将介绍几个关于怎么样使用
fn:collection XQuery 函数的以身作则。

在其真实情形况中,以上的 XML
文件恐怕置于网址上(因而能够透过互连网得到)、以文件格局储存在本土文件系统中,或以文件能源情势储存在
Oracle XML DB
音讯库中。就本示例而言,该公文位于网址上。为简便起见,能够在目录(Web
服务器在里边存款和储蓄可从 Web
看到的文书档案)中创立二个职员和工人文件夹,然后在该文件夹中插入 empsbonus.xml
文件,以便能够经过以下 U福特ExplorerL 访问 empsbonus.xml 文件:

相关文章