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 基于示例数据库形式 HKuga的私下认可职员和工人涉嫌表中蕴藏的多寡构建 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 在此地将其用作参数)来说,请留神嵌套的 FLWO福睿斯表达式中选拔的 ora:view XQuery 函数。在该示例中,ora:view
获取多个输入参数,即“H卡宴”和“employees”,它们提示该函数查询属于 HENVISION数据库格局的职员和工人表。由此,ora:view 将赶回三个象征 HENVISION.employees
表行的员工 XML
文书档案系列。但为了节约结果文书档案中的空间,只将前多少个职员和工人记录传递给结荚系列。那是经过在
FLWOSportage 表明式的 where 子句中钦命 $i/EMPLOYEE_ID <= 102
而得以实现的。请小心 FLWO奥迪Q5 表明式的 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/TIGETucson是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奥迪Q5情势,肩负管理部门、雇员、专业以及薪给音信。图4-2彰显了HPAJERO形式的详细数据结构图示。

图片 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。那是二个在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。那是一个VARCHA奥迪Q52(25)的VAWranglerRAY。那几个VA宝马X5RAY在CUSTOMEWranglerS表中作为单身的列存款和储蓄,能够用于存款和储蓄最多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形式有贰个名称叫O奥德赛DE中华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 特别轻松直接。它赢得表示新闻库文件能源 (URI) 的字符串并回到该 UCRUISERI
指向的文书档案。要领会 fn:collection XQuery
函数的效应,同一文件夹中至少应当四个音讯库文件。如若已经运转了列表 1中的代码,则早已创制了 /public/employees 消息库文件夹并在中间存款和储蓄了
employees.xml 文件。由此,您将索要在该公文夹中最少再次创下立多个 XML
文件,然后技术试用 fn:collection。列表 2 中的 PL/SQL 代码基于
SCOTT/TIGEQX56 演示数据库格局的 dept 和 emp 表存款和储蓄的关周详据创设XML,然后将扭转的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees
信息库文件夹。要运营列表 2 中的 PL/SQL 进度,请确认保证以 SCOTT/TIGELAND的身价登陆。

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 使用 X帕特h // 构造,从而导航到
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
文件,以便能够通过以下 U昂科雷L 访问 empsbonus.xml 文件:

http://localhost/employees/empsbonus.xml

接下去,借使您须求根据 empsbonus.xml
文书档案中储存的数码创造三个报表。在该报表中,您只怕不只要包括列表中体现的奖金多寡以及各种职员和工人的职员和工人ID,还要包涵他/她的姓名。由此,能够率先应用以下查询生成三个新的 XML
文书档案(若是你以 H大切诺基/HEvoque 的身价连接):

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
调治的最首要对象是幸免访问对结果未有其余影响的行,因而大概要一而再调节查询以优化质量。对查询中含有的
X帕特h 表明式实行双重新创建立模型后,能够另行重试它,如下所示:

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
时,您只需编写相当少的代码就能够获得同等的末梢结出。

查询 奥迪Q5SS 音讯提供

鉴于 PAJEROSS 新闻提供精神上是叁个托管的 XML 文件(TiguanSS
新闻阅读器从中得到头条音讯或其余剧情),因而能够像管理其余别的能够通过
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
标志,而不是单独转移多少个如上所示的 XML
文书档案。那样,您便得以构建叁个更加灵活、可维护性更加高的应用程序,原因是在这种场馆下,全数汉兰达SS 管理(从提取要求的数额到将它包裹在 HTML
标识中)都将转移到数据库。那使您不要编写担当 3 WheelerSS
处理的应用程序代码。实际上那意味你不要在诸如 凯雷德SS
新闻提供的构造早就转移的意况下修改应用程序代码。相反,您只需修改用于 途锐SS
管理的 XQuery 表明式。

总结

您曾在本文精通到,XQuery
是二个回顾的查询语言,它提供了一种用于查询、构建和转移 XML
数据的急迅方法。就算 Oracle XQuery 执行让你能够操作任何能够用 XML
表示的数目(无论它存款和储蓄在数据库中、位于网址上大概存款和储蓄在文件系统中),但将管理的数额移动到数据库中一贯是叁个不易的呼声。对于数据库中积攒的多寡,Oracle
XML DB(对 XPath
重写使用同一机制)只好眼看优化管理那么些基于以下数据创设的 XQuery
表明式:那么些多少包括关周详据、对象-关周全据或利用结构化(对象-关系)存储技艺存款和储蓄的依据XML 情势的 XMLType 数据。

(主编:铭铭)

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

回去数据库首页

相关文章