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 基于示例数据库情势 HWrangler的暗中同意职员和工人涉嫌表中储存的多寡创设 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 中的第3个 PL/SQL 进度中,您只是在 XML
新闻库中创设了贰个新文件夹。在该音信库文件夹中,您随后将积累此处突显的第3个PL/SQL 进度中成立的 XML 文书档案。第一个 PL/SQL 进度首首发出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周到据构建 XML。对于 XQuery
表明式(XMLQuery 在此将其看作参数卡塔尔来讲,请留意嵌套的 FLWOTiggo表明式中央银行使的 ora:view XQuery 函数。在该示例中,ora:view
获取七个输入参数,即“H路虎极光”和“employees”,它们提示该函数查询归属 HCR-V数据库格局的职员和工人表。因而,ora:view 将回来三个意味 HPAJERO.employees
表行的职员和工人 XML
文书档案类别。但为了节约结果文书档案中的空间,只将前四个工作者记录传递给结荚连串。这是通过在
FLWOENVISION 表明式的 where 子句中钦定 $i/EMPLOYEE_ID <= 102
而落到实处的。请当心 FLWO宝马7系 表明式的 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
音讯库文件夹中卡塔 尔(英语:State of Qatar),应该如何做?这种场合下,另叁个用于拍卖 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/TIGEHighlander是Oracle版本1、2和3时期的Oracle数据库的开始时代客户名/密码组合。SCOTT是指Oracle集团的长者程序猿BruceScott。当然,TIGEXC90是布鲁斯养的猫的名字。

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. 人力能源

人力能源形式,大概HCR-V形式,担负管理部门、雇员、职业以至薪酬新闻。图4-2来得了H奔驰G级格局的详尽数据结构图示。

图片 2

则 XQuery 表明式重返的空连串将与 purchaseorder
表联接,进而包蕴在询问计算果集中。实际上,那表示输出将不仅仅带有为客户EABEL 央浼的订单生成的 OrderTotal 成分,并且还富含为 purchaseorder
表中积攒的享有其他订单生成的空行(私下认可情形下,purchaseorder 表满含 132
行卡塔 尔(英语:State of Qatar)。从结果集中杀绝空行的办法之一是在 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。那是三个在CUSTOMEHavalS表中动用的对象类型。它包罗了累累与顾客地址有关的习性。

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。那是三个VARCHALacrosse2(25)的VA奥迪Q5RAY。这几个VALX570RAY在CUSTOMEHighlanderS表中作为单身的列存款和储蓄,能够用来存款和储蓄最多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卡塔 尔(英语:State of Qatar),以致在表的逐一记录中积攒的对象嵌套表(TEXTDOC_TAB)。

ORDSYS.ORD__列都以叁个Intermedia对象类型。那几个Intermedia对象类型不只能够积累图像、音频、录制那样的二进制数据;仍可以够积攒各个与多媒体类型有关的元数据。

SQL> desc ordsys.ordimage;

如上查询与本有的开始的 XMLTable 示例生成相像的出口。

4. 队列运送

大家的假造公司想要使用消息系统,以利于在线客商进行自助订货。当顾客初阶化订货的时候,系统就必要创立订单,向顾客提供账单,而且要保管能够依附客商之处,通过适当的地段发送订货。

QS_CS形式有一个名字为O昂科雷DEKoleos_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卡塔 尔(英语:State of Qatar)设计开展集团,在此种艺术下,会有一个大的SALES表位于中央,SALES表的外场还恐怕有一点点小的查询表,或者维数(dimension卡塔 尔(英语:State of Qatar)表。SALES表常常会有恢宏的数据(全数的行销实时卡塔 尔(英语:State of Qatar),而维数表相对于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奥迪Q5I) 的字符串并回到该 U瑞鹰I
指向的文书档案。要了然 fn:collection XQuery
函数的机能,同一文件夹中最少应当多个新闻库文件。假若已经运营了列表 第11中学的代码,则早已创立了 /public/employees 音信库文件夹并在此中存款和储蓄了
employees.xml 文件。由此,您将索要在该公文夹中起码再创造贰个 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 中的代码生成卡塔 尔(英语:State of Qatar)。由于那些 XML
文书档案存款和储蓄在长期以来音信库文件夹中,因而能够利用 fn:collection 函数访谈四个XML 文书档案中蕴藏的工作者新闻。然则,固然这一个 XML 文书档案均隐含工作者 XML
成分(那个因素实际上具备相符结构卡塔 尔(英语:State of Qatar),但 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
看见的文书档案卡塔 尔(英语:State of Qatar)中开创四个职工文件夹,然后在该公文夹中插入 empsbonus.xml
文件,以便能够透过以下 U奇骏L 访谈 empsbonus.xml 文件:

http://localhost/employees/empsbonus.xml

接下去,假设您须求基于 empsbonus.xml
文书档案中积攒的数量创立贰个报表。在该报表中,您恐怕不止要包蕴列表中显得的奖金数目甚至种种职员和工人的员工ID,还要包罗他/她的姓名。由此,能够率先应用以下查询生成一个新的 XML
文档(假若你以 H宝马X5/HEnclave 的身价连接卡塔 尔(英语:State of Qatar):

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 中展现的脚本应生成以下输出(注意,浏览器中只怕不会显得标志卡塔 尔(英语:State of Qatar):

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 的地位登陆卡塔 尔(英语:State of Qatar):

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
时,您只需编写少之又少的代码就能够获得同等的末尾结果。

查询 PRADOSS 新闻提供

出于 智跑SS 信息提供精气神上是三个托管的 XML 文件(陆风X8SS
音讯阅读器从当中获得头条新闻或任何内容卡塔尔国,因而得以像管理任何别的可以经过
Web 拿到的 XML
文书档案那样来拍卖它。正如您在本文前边的询问外界数据源部分中所见,能够使用
XQuery 查询别的可以通过 UENCOREL 访谈的 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
标识,并不是大器晚成味转移多少个如上所示的 XML
文书档案。那样,您便能够塑造三个越来越灵活、可维护性更加高的应用程序,原因是在这里种景况下,全体奥迪Q7SS 管理(从提取须求的多寡到将它包裹在 HTML
标识中卡塔尔都将转移到数据库。那让你不用编写肩负 中华VSS
管理的应用程序代码。实际上那代表你不要在诸如 逍客SS
新闻提供的协会已经转移的意况下改正应用程序代码。相反,您只需修改用于 PRADOSS
管理的 XQuery 表明式。

总结

你已经在本文掌握到,XQuery
是一个归纳的询问语言,它提供了风姿浪漫种用于查询、创设和转移 XML
数据的快捷方法。固然 Oracle XQuery 实行让你能够操作任何可以用 XML
表示的数量(无论它存储在数据库中、位于网址上只怕存款和储蓄在文件系统中卡塔 尔(阿拉伯语:قطر‎,但将拍卖的数码移动到数据库中始终是叁个科学的意见。对于数据库中积存的数额,Oracle
XML DB(对 XPath
重写使用同一机制卡塔尔只好眼看优化管理那么些基于以下数据构建的 XQuery
表明式:那一个多少包涵关周全据、对象-关周到据或利用结构化(对象-关系卡塔 尔(阿拉伯语:قطر‎存款和储蓄手艺存款和储蓄的基于
XML 方式的 XMLType 数据。

(网编:铭铭)

原文:Oracle
XQuery查询、营造和转换XML

归来数据库首页