澳门萄京娱乐场营造和转换XML,新玖i示例情势

Oracle 玖i产品扶助文书档案:

在 Oracle 数据库 10g 第 贰 版中,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 数据库 拾 g 第 二版中,XQuery 将比那么些函数更为快速。具体而言,在 XQuery 表达式内部使用
ora:view XQuery 函数,您能够查询现有的涉嫌表或视图以及当时营造XML,从而不必经过关全面据显式创立 XML 视图。列表 一 中的 PL/SQL
代码演示了何等接纳 ora:view 基于示例数据库格局 HEnclave的暗许员工涉嫌表中蕴藏的多少构建 XML 文档。

Sample Schemas的目录:

列表 一:使用 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;
/

 

在列表 一 中的首个 PL/SQL 进程中,您只是在 XML
音信库中创建了3个新文件夹。在该新闻库文件夹中,您随后将积存此处展现的第三个PL/SQL 进程中开创的 XML 文书档案。首个 PL/SQL 进度首首发出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周详据营造 XML。对于 XQuery
表达式(XMLQuery 在那里将其用作参数)而言,请留心嵌套的 FLWO奥迪Q5表明式中采纳的 ora:view XQuery 函数。在该示例中,ora:view
获取四个输入参数,即“H汉兰达”和“employees”,它们提示该函数查询属于 HEscort数据库形式的职员和工人表。由此,ora:view 将回到贰个意味 H库罗德.employees
表行的职员和工人 XML
文书档案体系。但为了节约结果文书档案中的空间,只将前多个职员和工人记录传递给结荚体系。那是透过在
FLWOENVISION 表明式的 where 子句中钦赐 $i/EMPLOYEE_ID <= 102
而达成的。请留心 FLWOOdyssey 说明式的 return 子句中使用的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的那四个 XQuery
表明式不仅将 XML
节点值转换为相应的档次,而且还将领到那几个节点值。随后,生成的职工 XML
文书档案作为 employees.xml 保存到在此之前在列表 1 中另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
文书档案(存款和储蓄在同1 XML
消息库文件夹中),应该如何做?那种情形下,另七个用来拍卖 XML
新闻库财富的 XQuery 函数(即
fn:collection)可能会派上用场。本文稍后将介绍多少个关于怎样运用
fn:collection XQuery 函数的以身作则。

随着最新版本的Oracle数据库Oracle
九i的面世,又推荐了崭新的一组示例方式,它们的对象是扩徐熙媛(Barbie Hsu)(英文名: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情势能够提供一些示例表以及数据,来呈现数据库的部分天性。它是一个杰出不难的情势,如图四-一数据结构图所示(通过PowerDesign逆向工程转换为数据库模型)。

图四-1 SCOTT形式数据结构图

 澳门萄京娱乐场 1

怎么要将那个情势命名字为SCOTT呢?SCOTT/TIGE大切诺基是Oracle版本一、贰和叁时期的Oracle数据库的先前时代用户名/密码组合。SCOTT是指Oracle企业的泰斗程序员BruceScott。当然,TIGELAND是Bruce养的猫的名字。

SCOTT方式中所体现的数据库本性平常被认为是多数关周到据库产品中的重要特征。假如想要真实地显示Oracle数据库的作用,就要强化这一个示例!

ORDERTOTAL
-------------------------------------------------------------

EABEL-20021009123338324PDT
1328.05


EABEL-20021009123335791PDT
2067.15


EABEL-20021009123336251PDT
289.6


EABEL-20021009123336382PDT
928.92

四.二 Oracle 九i示例格局

Oracle技术能够选用于各个差别的环境中。技术化解方案的多少个应用极端气象是,高速在线事务处理和数据库仓库。尽管用户能够动用2个格局,呈现怎么着在同等的表中达成在线事务处理和数据仓库。可是用户不用容许行使这种艺术完结实用的缓解方案。我们在近年来的产业界中平时能够发现,为了解决现实世界中的分化总结需要,日常在单身的数据库实例中会存在差别的格局,或然在互联网上会有大气分布式数据库。新的Oracle
玖i示例格局模型极好地对那么些场景建立模型。

Oracle
九i示例情势试图模型化一个切实可行世界中兼有一名目繁多典型业务部门的销售团队。这么些不相同的部门有着不一样的音讯技术供给,每三个示范形式都利用了分歧的Oracle技术来解决它们各自的题材。其余,每种形式设计方案都对准特定的技巧用户。这几个方式如下:

  • H凯雷德——人力财富。
  • OE——订单输入。
  • PM——产品媒体。产品媒体在数据库中储存了铺面连串产品的相干多媒体内容,能够用来在Web上发表以及打字与印刷。PM利用了Oracle
    Intermedia,它尤其规划用来拍卖宣布音频、录像以及可视数据的多媒体领域。其它,PM也频仍地使用了LOB列类型。
  • QS——队列运送。运送部门担负记录公司向客户拓展的出品运载景况,并且使用伍个情势来实现那项工作。QS、QS_ES、QS_WS、QS_OS、QS_CB和QS_CS构成了队列运送形式的聚集。
  • SH——销售历史。

要获取同等的终极结出,能够改用 XMLQuery 函数。但万壹将上三个演示中使用的
XQuery 表明式参数传递给 XMLQuery(如下所示):

4.2.一 深切座谈种种格局

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;

一. 人力能源

人力能源情势,恐怕H纳瓦拉形式,负责管理部门、雇员、工作以及薪水新闻。图四-二出示了HLX570格局的详尽数据结构图示。

澳门萄京娱乐场 2

则 XQuery 表明式重返的空体系将与 purchaseorder
表联接,从而包含在查询总计果集中。实际上,那代表输出将不仅仅富含为用户
EABEL 请求的订单生成的 OrderTotal 成分,而且还蕴藏为 purchaseorder
表中蕴藏的兼具别的订单生成的空行(暗中认可意况下,purchaseorder 表包蕴 13二行)。从结果集中拔除空行的格局之1是在 SELECT 语句的 WHERE 子句中动用
existsNode SQL 函数,而不是在 XQuery 表明式中选用 WHERE 子句,如下所示:

2. 订单输入

订单输入(Order
Entry)情势,或许OE方式,可以用来治本集团从事商务活动的逐条渠道中的客户、销售订单以及产品仓库储存。

图四-3详尽描写了OE情势的数据结构。就如小编辈原先掌握的,与人力财富形式相比较,订单输入形式越发复杂。

澳门萄京娱乐场 3

图4-三 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卡宴贰(25)的VA陆风X八RAY。这几个VALacrosseRAY在CUSTOMEHavalS表中作为单身的列存款和储蓄,能够用于存款和储蓄最多多少个电话号码。

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;

叁. 出品媒体

产品媒体(Product
Media)情势,恐怕PM格局,用于管理描述公司产品的多媒体数据。摄像、音频和图像那样的在线媒体都足以随输出的媒体数据类型存款和储蓄在数据库中。那是大家要特别钻探的情势之1,它珍视于多媒体内容,以及Oracle
Intermedia所提供的法力。

注意:

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

除去Intermedia数据存款和储蓄以外,PM情势还尤其重视LOB列类型的运用来储存数据。

出品媒人体模型式是Oracle 玖i使用名叫Oracle
Intermedia的Oracle技术消除具体世界商务必要的优秀示例。例如,大家虚构的小卖部就能够储存多媒体数据依旧输出多媒体数据。由此,产品媒人体模型式中的示例可以形成如下工作:

  • 为Oracle中应用Web公布的内容存储缩略图和完全尺寸的图像。
  • 在Oracle中储存音频剪辑。
  • 在Oracle中存款和储蓄摄像剪辑。
  • 对图像类型进行处理,以便转换到与Web包容的图像类型

运用Oracle
Intermedia,一些早已很难落实的职分就变得相对简单。图四-4象征为产品媒人体模型式,以及它对订单输入表PRODUCT_INFORMATION的引用。

澳门萄京娱乐场 4

图四-四 PM格局数据结构

PRINT_MEDIA表拥有二个指标类型(ADHEADESportage_TYP),以及在表的各类记录中存款和储蓄的指标嵌套表(TEXTDOC_TAB)。

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

SQL> desc ordsys.ordimage;

如上查询与本有的起头的 XMLTable 示例生成相同的出口。

四. 行列运送

笔者们的虚拟公司想要使用音讯系统,以福利在线客户拓展自助订货。当客户开首化订货的时候,系统就供给树立订单,向客户提供账单,并且要确定保障能够依照客户的职责,通过适当的地点发送订货。

QS_CS情势有2个名称叫O福睿斯DE牧马人_STATUS_TABLE的表,能够储存订单状态。那是在全部队列运送情势安装进程中唯第3建工公司立表(除了通过高档队列API建立的连串表以外)。大家不会来得与表有关的数据结构图,而是要琢磨为队列运送格局所建立的队列系统中的音信流程。

图4-伍所示流程图示中得以看来,为了提供3个清楚、直观的订购——发货——结算循环,要在部门之间怎样传递新闻。

澳门萄京娱乐场 5

图肆-5 为队列运送(QS)方式在队列系统中确立的信息流程

全方位都要从图示顶部的订单输入起先。Oracle
Input(订单输入)进程所生成的订单会放入New Order
Queue(新订单队列)中。那个队列要Oracle
Entry应用处理,然后会将订单放到Booked Orders
Queue(登记订单队列)中。再将Booked Orders
Queue中的订单发往适中的运载中央(East(南边)、韦斯特(西边)只怕Overseas(国外)),以及客户服务机关。

在那儿,运送中央就会接到要做到的订单,并且向客户发送订货,而且客户服务机关也会发觉到订单的气象。在适度的运送中央,Shipping
Center(运送大旨)应用就会承受发送订货,大概将预定调整回订单状态。1旦取得了出品,就会发送退回为订单状态的出品,并且将订单放到shipped
orders(已运送订单)队列中。

当订单发送之后,就会由此shipped orders
gueue通告客户服务和客户结算部门,并且向客户发送账单。经过结算的订单会放在Billed
Orders(已结算订单)队列中,它会打招呼客户服务单位,然后就足以做到订单处理进程。

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

伍. 销售历史

现行反革命商务条件中的公司曾经意识,除非人们能够运用壹种有意义并且即时的措施,依据音信变化精确的裁定报告,不然世界上的享有销售新闻都是毫无价值的。决策帮助(decision
support)正是用来叙述在进展表决的进度中国国投息技术运用的术语。

销售历史形式是三个价值观数据仓库的以身作则。表会根据星型方式(star
schema)设计实行公司,在这种方法下,会有1个大的SALES表位于中央,SALES表的外界还会有局部小的查询表,恐怕维数(dimension)表。SALES表平时会有雅量的数额(全数的销售实时),而维数表相对于SALES表来讲会非常小。

图四-6的数据结构图体现了销售历史情势:

澳门萄京娱乐场 6

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

为访问 Oracle XML DB 音讯库中存款和储蓄的 XML 数据,Oracle XQuery 引进了
fn:doc 和 fn:collection XQuery 函数。使用 fn:doc,您能够查询 XML
新闻库中储存的单个 XML 文档,而 fn:collection
使您能够访问同壹音讯库文件夹中存款和储蓄的多少个 XML 文档。

肆.贰.二 渐进学习情势

依照不相同的受众协会情势的办法能够鼓励新的Oracle用户通过结构化的点子学习技能。例如,初学者能够从人力资源开首。那可以让她深谙关系概念、查询数据、数据库操作语言、数据库定义语言、以及部分别样基本概念。

当新Oracle用户熟谙了人力能源情势之后,能够三番五次分析订单输入方式。在那些新形式中,他将会遇上对象类型、XML援助、Oracle
Spatial、以及其余部分相比高档的数据库特性。

接下去,用户能够分析任何格局所提供的一定领域。多媒体育专科高校家能够深刻学习产品媒人体模型式。设计发布-订阅型基于音讯的系统的用户能够发现,队列运送格局在她们先河读书Oracle高级队列的时候将会尤其有帮衬。数据仓库的热衷者最佳去分析和领会销售历史方式。

正如本文以前(参阅使用关全面据营造 XML部分)介绍的以身作则所示范,使用
fn:doc 非凡不难直接。它得到表示音讯库文件能源 (U纳瓦拉I) 的字符串并赶回该 U讴歌MDXI
指向的文书档案。要精晓 fn:collection XQuery
函数的效率,同一文件夹中至少应当五个音信库文件。如若已经运转了列表 1中的代码,则早就创建了 /public/employees 新闻库文件夹并在内部存款和储蓄了
employees.xml 文件。因而,您将索要在该公文夹中最少再次创下立三个 XML
文件,然后才能试用 fn:collection。列表 二 中的 PL/SQL 代码基于
SCOTT/TIGER 演示数据库情势的 dept 和 emp 表存款和储蓄的关周全据创设XML,然后将扭转的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees
消息库文件夹。要运营列表 二 中的 PL/SQL 进程,请保管以 SCOTT/TIGERubicon的地位登录。

四.二.叁 发现更加多关于示例格局的剧情

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

二. 自解释方式

Oracle提供了1种能够让表的全数者在数据库中存储表大概列的纯文本注释的秘籍。在示范格局安装时期,各种格局都拥有三个本子,能够为它们各自的表和列建立那个注释。那能够使用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(由列表 二 中的 PL/SQL
代码生成)和 employees.xml 文件(由列表 一 中的代码生成)。由于这一个 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
看到的文书档案)中开创1个职员和工人文件夹,然后在该公文夹中插入 empsbonus.xml
文件,以便能够透过以下 U路虎极光L 访问 empsbonus.xml 文件:

http://localhost/employees/empsbonus.xml

接下去,要是您须要依照 empsbonus.xml
文书档案中存款和储蓄的多寡创造三个报表。在该报表中,您也许非但要包括列表中显示的奖金多少以及各种员工的员工ID,还要包括他/她的真名。因而,可以率先选取以下查询生成2个新的 XML
文书档案(即便你以 H揽胜极光/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;

上述查询是1个有关如何利用 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 是1种用于查询 Oracle 数据仓库储存款和储蓄的
XML 内容的火速方法 – 无论你是处理地点存款和储蓄的 XMLType
数据只怕查询基于关全面据创设的 XML
视图。但基于对数据选取的囤积类型的两样,XQuery
表达式的施行质量或者截然不一样分化。更加是,Oracle XML DB 能够优化基于由
ora:view 函数创设的 SQL/XML 视图而创设的 XQuery 表明式。对于 XMLType
表或列中存款和储蓄的 XML 数据,只好对使用结构化(对象-关系)存款和储蓄技术存款和储蓄的基于
XML 方式的 XMLType 数据开始展览 XQuery 优化。

所挑选的贮存模型并非是震慑 XQuery
表明式执行质量的唯1因素。在少数景况下,XQuery
表明式本人的构造也说不定造成质量难点。要监察和控制 XQuery
表达式的习性,能够打字与印刷并检查关联的 EXPLAIN PLAN。在 SQL*Plus
中,只需安装 AUTOTRACE 系统变量,即可打字与印刷 SQL
优化程序行使的实施路径。但要执行该操作,请确认保障创立 PLUSTRACE
剧中人物,然后将其给予连接到数据库所利用的用户。有关怎样实行此操作的音信,请参阅
Oracle 数据库 10g 第 贰 版 (10.二) 文书档案中《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 查询中接纳绑定变量。

列表 叁:使用绑定变量

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

列表 三 中显得的脚本应生成以下输出(注意,浏览器中也许不会显示标记):

100
SKING
AD_PRES

XQuery 与 XSLT

固然 Oracle 在 Oracle XML DB 中提供了二个自带 XSLT
处理器,但在众多情景下(越发是在处理大型文书档案时),XQuery 对于塑造 XML
更敏捷。其余,XQuery 表达式经常比为同一作业设计的 XSLT
样式表更具可读性,并且更明亮。与 XSLT 一样,XQuery 不但可用来将2个 XML
文书档案转换为另三个 XML 文书档案,而且还可用于将 XML
转换为另1种基于文本的格式,如 HTML 或 WML。

在本文前边的询问 XMLType 数据部分中,您看来了多个关于使用 XQuery 将2个XML 文档转换为另二个 XML 文档的演示。具体而言,该示例使用 XQuery
表达式总结示例数据库方式 OE 的 purchaseorder
表中贮存的订单的订单一共,然后为处理的各类订单生成了多个 OrderTotal XML
成分。实际上,您能够采纳 XSLT
执行同1操作。为此,您首先须求创设1个选择于 PurchaseOrder XML 文书档案的
XSLT 样式表,以转移对应的 OrderTotal 成分。对于此示例,能够利用列表 4中所示的 XSLT 样式表。

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

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



























为便宜起见,您只怕需求将此 XSL
样式表保存在数据库中,然后再起来应用它。例如,您能够将样式表作为文件财富保存在
Oracle XML DB
音讯库中。执行该操作的章程之壹是将样式表作为文件保留到地方文件系统中,然后选用以下有个别互联网球协会议将它移动到
XML 消息库:FTP、HTTP 或 WebDAV。若是你已经将列表 四 中的 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
查询同一的输出。

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

查询 奥德赛SS 音信提供

出于 CR-VSS 音讯提供精神上是三个托管的 XML 文件(昂科拉SS
新闻阅读器从中得到头条信息或此外剧情),因而能够像处理其余其余能够经过
Web 获得的 XML
文书档案这样来处理它。正如你在本文前边的查询外部数据源部分中所见,可以采取XQuery 查询任何能够通过 U酷路泽L 访问的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全体外部 XML 数据源。以下是叁个查询 本田CR-VSS
音信提供的 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
文档。那样,您便足以塑造3个更加灵敏、可维护性越来越高的应用程序,原因是在那种场馆下,全体奥迪Q5SS 处理(从提取须要的多少到将它包裹在 HTML
标记中)都将转移到数据库。那使你不用编写负责 EscortSS
处理的应用程序代码。实际上那意味你不要在诸如 冠道SS
音讯提供的组织已经转移的情景下修改应用程序代码。相反,您只需修改用于 帕杰罗SS
处理的 XQuery 表明式。

总结

您曾经在本文通晓到,XQuery
是四个回顾的查询语言,它提供了1种用于查询、营造和更换 XML
数据的短平快方法。固然 Oracle XQuery 实施使你能够操作任何能够用 XML
表示的数码(无论它存款和储蓄在数据库中、位于网址上或许存款和储蓄在文件系统中),但将处理的多少移动到数据库中一向是一个毋庸置疑的呼吁。对于数据库中贮存的数据,Oracle
XML DB(对 XPath
重写使用同样机制)只可以眼看优化处理那1个基于以下数据构建的 XQuery
表明式:这么些数据包罗关周全据、对象-关周到据或使用结构化(对象-关系)存款和储蓄技术存款和储蓄的依据XML 情势的 XMLType 数据。

(责编:铭铭)

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

回来数据库首页

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注