营造和转换XML葡京娱乐网,Oracle编制程序入门经典

4.2.3 发现越来越多关于示例方式的始末

总结

脚下hr已经锁定了(即lock)。要求履行以下脚本:


100
King
24000


101
Kochhar
17000


102
De Haan
17000

乘胜新型版本的Oracle数据库Oracle
9i的产出,又引进了全新的一组示例格局,它们的对象是扩展SCOTT情势向用户提供的成效。全部这几个格局一起形成了一如既往的杜撰公司的一局地,它们分别都有谈得来的政工主旨。例如,人力能源部、订单输入部门以及发货部门都有分手的方式。

在本文前边的询问 XMLType 数据部分中,您看看了二个关于使用 XQuery 将2个XML 文书档案转换为另三个 XML 文书档案的以身作则。具体而言,该示例使用 XQuery
表明式总括示例数据库方式 OE 的 purchaseorder
表中蕴藏的订单的订单一共,然后为处理的各种订单生成了四个 OrderTotal XML
成分。实际上,您能够应用 XSLT
执行同一操作。为此,您首先必要成立三个使用于 PurchaseOrder XML 文书档案的
XSLT 样式表,以转变对应的 OrderTotal 成分。对于此示例,能够运用列表 4
中所示的 XSLT 样式表。

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

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

您恐怕对为上述查询生成的实践安顿并不乐意。越发是,所处理的行数大概相当的大。由于
SQL
调整的首要对象是制止访问对结果尚未其他影响的行,因而大概要继承调整查询以优化质量。对查询中隐含的
XPath 表达式实行重复建立模型后,能够重复重试它,如下所示:

4.1 SCOTT模式

所提供的SCOTT情势能够提供一些示例表以及数据,来彰显数据库的一对风味。它是贰个一定简单的格局,如图4-1数据结构图所示(通过PowerDesign逆向工程转换为数据库模型)。

图4-1 SCOTT格局数据结构图

 葡京娱乐网 1

为什么要将那些情势命名为SCOTT呢?SCOTT/TIGE昂科威是Oracle版本① 、2和3时期的Oracle数据库的早期用户名/密码组合。SCOTT是指Oracle公司的普陀山北斗程序员BruceScott。当然,TIGE昂Cora是Bruce养的猫的名字。

SCOTT情势中所展现的数据库本性经常被认为是大部分关周全据库产品中的重要特征。假若想要真实地显示Oracle数据库的功效,就要强化这么些示例!

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



























4.2 Oracle 9i示例格局

Oracle技术能够行使于各个不一样的条件中。技术化解方案的八个使用极端气象是,高速在线事务处理和数据库仓库。固然用户能够使用2个形式,彰显怎么着在同等的表中完毕在线事务处理和数据仓库。可是用户不用容许行使那种方法贯彻实用的缓解方案。我们在当今的业界中时常能够发现,为了消除现实世界中的分歧总括供给,平日在单身的数据库实例中会存在不一样的方式,大概在互联网上会有大批量分布式数据库。新的Oracle
9i示例情势模型极好地对那些境况建立模型。

Oracle
9i示例形式试图模型化三个现实世界中保有一密密麻麻典型业务部门的销售团队。那么些差异的部门有着不相同的新闻技术需求,每二个示范方式都选拔了不一致的Oracle技术来缓解它们分别的题材。此外,各个情势设计方案都对准一定的技艺用户。那个方式如下:

  • H大切诺基——人力财富。
  • OE——订单输入。
  • PM——产品媒体。产品媒体在数据库中贮存了信用合作社系列产品的相干多媒体内容,能够用于在Web上宣布以及打字与印刷。PM利用了Oracle
    Intermedia,它尤其设计用来拍卖公布音频、录制以及可视数据的多媒体领域。其它,PM也一再地行使了LOB列类型。
  • QS——队列运送。运送部门担负记录集团向客户开始展览的产品运载境况,并且动用陆个方式来形成那项工作。QS、QS_ES、QS_WS、QS_OS、QS_CB和QS_CS构成了队列运送方式的聚集。
  • SH——销售历史。

该查询应生成以下输出:

4.3 小结

小说根据本身精通浓缩,仅供参考。

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

102
De Haan
17000


7839
KING
5000


100
King
24000


101
Kochhar
17000

 

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

询问 CRUISERSS 新闻提供

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的引用。

葡京娱乐网 2

图4-4 PM格局数据结构

PRINT_MEDIA表拥有二个对象类型(ADHEADE奥迪Q7_TYP),以及在表的次第记录中存款和储蓄的对象嵌套表(TEXTDOC_TAB)。

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

SQL> desc ordsys.ordimage;

该 XQuery 应生成一个 XML 文书档案,在那之中饱含 Oracle 技术网 (OTN) 近日宣告的与
PHP 技术有关的头条信息列表。所生成的 XML 文书档案大概如下所示:

4.2.2 渐进学习格局

依照分化的受众协会形式的主意得以鼓励新的Oracle用户通过结构化的法门学习技能。例如,初学者可以从人力财富起头。那可以让她熟谙关系概念、查询数据、数据库操作语言、数据库定义语言、以及部分其他基本概念。

当新Oracle用户熟谙了人力能源形式之后,可以三番九回分析订单输入情势。在这一个新方式中,他将会赶上对象类型、XML扶助、Oracle
Spatial、以及别的部分比较高档的数据库天性。

接下去,用户能够分析任何格局所提供的特定领域。多媒体育专科高校家能够深深学习产品媒人体模型式。设计公布-订阅型基于音讯的系统的用户能够窥见,队列运送格局在她们开头学习Oracle高级队列的时候将会至极有帮扶。数据仓库的热衷者最好去分析和询问销售历史情势。

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;

众多年来,Oracle教授、管理员、程序员、以及用户为了学习、测试或调整他们的数据库,都一向在选用这一个值得依靠的SCOTT情势开展着简单地询问、更新、以及去除操作。这个情势正是大家所说的言传身教情势。示例形式是表、视图、索引那样的数据库对象的聚合,并且随着预先供了表示小范围依然中等规模企业的多寡。

正文提供的演示不仅示范了在怎样场所下以及怎样运用 XQuery 查询、创设和转移
XML,而且还以身作则了什么样监督和剖析 XQuery
表达式的质量执行,从而找到更敏捷的办法来拍卖同一工作负荷。

Sample Schemas的目录:

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

4. 行列运送

大家的杜撰公司想要使用音讯系统,以方便在线客户开始展览自助订货。当客户初叶化订货的时候,系统就须求树立订单,向客户提供账单,并且要确定保障能够根据客户的任务,通过适当的地面发送订货。

QS_CS方式有一个名为O福特ExplorerDERAV4_STATUS_TABLE的表,能够储存订单状态。那是在方方面面队列运送方式安装进程中绝无仅有建立表(除了通过高档队列API建立的行列表以外)。我们不会显得与表有关的数据结构图,而是要切磋为队列运送情势所树立的种类系统中的音讯流程。

图4-5所示流程图示中可以看出,为了提供3个清晰、直观的预购——发货——结算循环,要在机构中间什么传递音信。

葡京娱乐网 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(已结算订单)队列中,它会通报客户服务单位,然后就能够形成订单处理进度。

列表 1:使用 ora:view 基于关周详据创制 XML

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.’;

化解品质难题

2. 订单输入

订单输入(Order
Entry)形式,也许OE方式,能够用来治本公司从事商务活动的顺序渠道中的客户、销售订单以及产品库存。

图4-3详尽刻画了OE方式的数据结构。就像是作者辈此前精通的,与人力财富格局比较,订单输入形式尤其复杂。

葡京娱乐网 4

图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。那是三个VA奥迪Q3CHA昂科威2(25)的VA中华VRAY。那么些VATiguanRAY在CUSTOME途锐S表中作为独立的列存款和储蓄,能够用来存款和储蓄最多七个电话号码。

SQL> desc phone_list_typ;

phone_list_typ VARRAY(5) OF VARCHAR2(25)

OE形式是三个很好的演示,它展现了规范的供应组织只怕电脑零售集团能够行使什么点子去管理它们完整订单处理进程。通过接纳订单输入表中的多寡,销售团队就能够向地下的客户提供高精度的出品音信,接受销售订单,量化订单收入,存款和储蓄客户新闻,为分裂地理地方订购产品的客户提供标准的仓库储存音信,以及其它服务。

但在开发实际应用程序时,您将很或者要求 XQuery 表明式直接生成 HTML
标记,而不是仅仅转移二个如上所示的 XML
文书档案。那样,您便得以营造3个更灵活、可维护性更高的应用程序,原因是在这种状态下,全部安德拉SS 处理(从提取要求的多寡到将它包裹在 HTML
标记中)都将转移到数据库。那使你不用编写负责 中华VSS
处理的应用程序代码。实际上那表示你不要在比如 帕杰罗SS
音讯提供的结构已经改变的情事下修改应用程序代码。相反,您只需修改用于 QX56SS
处理的 XQuery 表明式。

注意:

是因为 EscortSS 音信提供精神上是三个托管的 XML 文件(凯雷德SS
音讯阅读器从中获得头条新闻或其余情节),因而得以像处理任何其余能够透过
Web 获得的 XML
文书档案那样来处理它。正如您在本文前边的询问外部数据源部分中所见,可以使用
XQuery 查询任何能够经过 U逍客L 访问的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全部外部 XML 数据源。以下是三个询问 奥迪Q3SS
消息提供的 XQuery 示例:

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

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

可遵照自身索要展开询问,包蕴了好多的文书档案。

将 XML 分解为关全面据

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

那将扭转以下输出:

Oracle 9i产品帮忙文书档案:

查询 XMLType 数据

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

此时,/public/employees
新闻库文件夹应包罗多个文件:acc_dept.xml(由列表 2 中的 PL/SQL
代码生成)和 employees.xml 文件(由列表 1 中的代码生成)。由于这么些 XML
文书档案存款和储蓄在平等新闻库文件夹中,因而得以行使 fn:collection 函数访问四个XML 文书档案中存款和储蓄的职工消息。然则,就算这么些 XML 文书档案均含有职员和工人 XML
成分(那些成分实际上具有同等结构),但 XML 文书档案本身的构造迥然差别。在
employees.xml 中,文档根元素为 EMPLOYEES,而 acc_dept.xml 将 DEPA奥迪Q7TMENT
用作根成分。要缓解此难题,可以透过 XQuery 使用 XPath // 构造,从而导航到
XML 文书档案中的有个别节点,而不用钦定该节点的熨帖路径。以下示例演示了何等在
XQuery 表明式中央银行使 XPath // 构造:

 

接下去,假诺您供给依据 empsbonus.xml
文书档案中贮存的数额创立1个表格。在该报表中,您或然不只要含有列表中显得的奖金多寡以及各样职工的职工
ID,还要包涵他/她的全名。因而,能够率先利用以下查询生成二个新的 XML
文书档案(若是你以 HSportage/HENVISION 的身份连接):

1. 人力财富

人力财富方式,大概H纳瓦拉格局,负责管理部门、雇员、工作以及报酬音讯。图4-2显得了H冠道方式的详细数据结构图示。

葡京娱乐网 5

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

Sample Schemas的文书档案(示例形式的表及介绍):

将列表 4 中的 orderTotal XSLT 样式表与查询 XMLType
数据部分中的示例使用的 XQuery 表明式举办比较,您恐怕会小心到,XQuery
方法要比 XSLT 方法更具吸重力。至少在应用 XQuery
时,您只需编写很少的代码即可获得一致的结尾结果。

 

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

5. 销售历史

当今商务环境中的公司早已意识,除非人们能够利用一种有意义并且即时的主意,依照信息生成精确的核定报告,不然世界上的拥有销售消息都以毫无价值的。决策帮忙(decision
support)正是用来描述在开始展览表决的经过中国国投息技术运用的术语。

销售历史情势是七个价值观数据仓库的言传身教。表会依据长方形形式(star
schema)设计开始展览集团,在这种措施下,会有一个大的SALES表位于中央,SALES表的外侧还会有一对小的查询表,恐怕维数(dimension)表。SALES表常常会有恢宏的多寡(全体的行销实时),而维数表相对于SALES表来讲会相当小。

图4-6的数据结构图体现了销售历史格局:

葡京娱乐网 6

图4-6 销售历史情势数据结构

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
表明式的哪位构造将使一些查询的属性更好。那就是怎么最辛亏开发阶段使用调整工具的原故。

如上查询是一个关于怎样使用 XQuery 基于 XML 和非 XML
数据(以分歧的艺术从不一样的数目源中检索)生成 XML
文书档案的以身作则。具体而言,使用 ora:view() 函数访问 HR 演示形式中的默许
employees 关系表,并使用 PASSING 子句中的 httpuritype() 函数借助于
HTTP 访问 empsbonus.xml 文书档案。然后,在 FLWOR 表明式的 return
子句中塑造新的 XML 文书档案。最终,将获得以下 XML 文书档案:

100
1200


101
1000

(主编:铭铭)

列表 3:使用绑定变量

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;
100
SKING
AD_PRES

在其真实情况况中,以上的 XML
文件或然置于网站上(因而得以透过网络获得)、以文件方式储存在本半夏件系统中,或以文件财富格局储存在
Oracle XML DB
音讯库中。就本示例而言,该公文位于网站上。为简便起见,能够在目录(Web
服务器在里头蕴藏可从 Web
看到的文书档案)中成立一个职工文件夹,然后在该文件夹中插入 empsbonus.xml
文件,以便能够经过以下 UCRUISERL 访问 empsbonus.xml 文件:

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

您可以观察,以上输出包蕴从 employees.xml 和 acc_dept.xml 中拿走的职工
XML 成分,这几个成分表示薪俸大于或等于 5,000 法郎的职员和工人。

询问外部数据源

要拿走同等的最后结出,能够改用 XMLQuery 函数。但假设将上叁个示范中动用的
XQuery 表明式参数字传送递给 XMLQuery(如下所示):

在上述示例中,您在 XMLTable 函数的 PASSING 子句中利用 OBJECT_葡京娱乐网,VALUE
虚拟列将 purchaseorder 表作为左右文项传递给那里使用的 XQuery
表明式。XQuery 表明式计算用户 EABEL
请求的每一种购买订单的总共,并为处理的各样订单生成1个 OrderTotal XML
成分。要拜访生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE
虚拟列。最后的出口应如下所示:

借使应用程序处理关周详据而非 XML,而你要求拜访的数量以 XML
格式存款和储蓄,则将 XML
分解为关周到据也许会十分有效。继续拓展上一些的示范,您能够运用 SQL
函数 XMLTable 将职工 XML 成分分解为虚拟表的单个列,如下所示:

该查询将转变以下输出:


100
Steven King
1200


101
Neena Kochhar
1000
ORDERTOTAL
-------------------------------------------------------------

EABEL-20021009123338324PDT
1328.05


EABEL-20021009123335791PDT
2067.15


EABEL-20021009123336251PDT
289.6


EABEL-20021009123336382PDT
928.92

XQuery 与 XSLT

正如本文在此以前(参阅使用关周详据创设 XML部分)介绍的以身作则所示范,使用
fn:doc 10分不难直接。它拿走表示新闻库文件财富 (UHavalI) 的字符串并重返该 U哈弗I
指向的文书档案。要打听 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普拉多的地方登录。

列表 3 中显得的脚本应生成以下输出(注意,浏览器中可能不会议及展览示标记):

在需求的情事下(例如,向 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 文书档案。

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

归来数据库首页

另一种能够鲜明进步 XQuery
表达式执行品质的技艺是使用绑定动态变量。使用绑定变量(而不是将变量串联为字符串)能够使
Oracle 重用 SQL 语句,从而减少分析费用并肯定升高应用程序的习性。能够在
XMLQuery 和 XMLTable SQL 函数中选用 PASSING 子句将动态变量绑定到 XQuery
表明式。该技术使你能够根据客户端代码中总计的参数动态生成 XML。列表 3
中的示例演示了如何在从 PHP 脚本执行的 XQuery 查询中采纳绑定变量。

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

为便于起见,您可能需求将此 XSL
样式表保存在数据库中,然后再起来选拔它。例如,您能够将样式表作为文件能源保存在
Oracle XML DB
音讯库中。执行该操作的艺术之一是将样式表作为文件保留到地头文件系统中,然后使用以下有些互连网球组织议将它移动到
XML 音讯库:FTP、HTTP 或 WebDAV。即使你曾经将列表 4 中的 XSLT 样式表作为
orderTotal.xsl 保存在 /public
音信库文件夹中,现在得以按以下示例所示将它用作 XMLTransform SQL
函数的参数(借使你以 OE/OE 的身份登录):

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

则 XQuery 表明式再次来到的空种类将与 purchaseorder
表联接,从而包罗在询问总计果集中。实际上,那表示输出将不仅含有为用户
EABEL 请求的订单生成的 OrderTotal 成分,而且还隐含为 purchaseorder
表中储存的享有别的订单生成的空行(默许景况下,purchaseorder 表包涵 132
行)。从结果集中清除空行的不二法门之一是在 SELECT 语句的 WHERE 子句中采纳existsNode SQL 函数,而不是在 XQuery 表达式中运用 WHERE 子句,如下所示:

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

正如您从近期的言传身教中询问到的,在 Oracle XQuery 实施中,doc 和 collection
XQuery 函数用于访问 Oracle XML DB 消息库中蕴藏的 XML 文档。能够通过
XMLTable 和 XMLQuery SQL 函数中的 PASSING
子句动态绑定外部数据源。考虑以下示例。假诺你的商号要为那么些从事于 XQ
项指标职员和工人支付奖金。由此,财务部发表了 empsbonus.xml
文件,个中蕴蓄有身份得到奖金的职员和工人列表以及该列表中输入的各类职工的奖金数目。empsbonus.xml
文件或许如下所示:

列表 2:基于关周到据创设 XML 并将其保存到 XML 音讯库

您能够看来,以上呈现的询问生成相同的最后结出,但它们的实践安顿并差异。查看最终四个演示中的
XQuery 表明式,您只怕会注意到它迭代顶层 PurchaseOrder 元素,在那之中的各样PurchaseOrder 元素都表示依照 PurchaseOrder XMLType
情势的表中的一条龙。那表示实际上海重机厂写 XQuery
表明式,以迭带基础对象表(用于存款和储蓄分解的 PurchaseOrder
文档)中的行。与查询要迭代不意味基础表中的单个行的 XML
成分相比较,该措施的性质更好有的。

正如您从眼下的有个别中打探到的,XQuery 是一种用于查询 Oracle 数据仓库储存款和储蓄的
XML 内容的全速方法 – 无论你是拍卖地方存款和储蓄的 XMLType
数据恐怕查询基于关全面据创设的 XML
视图。但根据对数码运用的积存类型的两样,XQuery
表达式的执行品质大概截然分歧区别。尤其是,Oracle XML DB 能够优化基于由
ora:view 函数创造的 SQL/XML 视图而营造的 XQuery 表明式。对于 XMLType
表或列中存款和储蓄的 XML 数据,只可以对应用结构化(对象-关系)存款和储蓄技术存款和储蓄的根据XML 形式的 XMLType 数据进行 XQuery 优化。

行使 XQuery,能够依照 XML 数据以及能够用 XML 表示的非 XML 数据生成 XML
文书档案,无论其地方怎么:无论是存款和储蓄在数据库中、置于网站上、即时创建恐怕存储在文件系统中。但要注意,Oracle
XML DB 为针对数据库中贮存的数量举行的 XML
操作提供了尤其高的习性和可伸缩性。因而,若是您能够完全控制所拍卖的数额,则最好将它移动到数据库中。

所挑选的囤积模型并非是震慑 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 的地点登录并运维以下查询:

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

SELECT XMLTRANSFORM(OBJECT_VALUE,
xdbUriType('/public/orderTotal.xsl').getXML()).GetStringVal() AS RESULT FROM
purchaseorder WHERE existsNode(OBJECT_VALUE, 
'/PurchaseOrder[User = "EABEL"]') = 1;

固然 Oracle 在 Oracle XML DB 中提供了二个自带 XSLT
处理器,但在成千成万场所下(特别是在处理大型文书档案时),XQuery 对于创设 XML
更高效。其它,XQuery 表达式平常比为同一作业设计的 XSLT
样式表更具可读性,并且更明亮。与 XSLT 一样,XQuery 不但可用以将2个 XML
文书档案转换为另二个 XML 文书档案,而且还可用来将 XML
转换为另一种基于文本的格式,如 HTML 或 WML。

在列表 1 中的第①个 PL/SQL 进程中,您只是在 XML
音信库中开创了1个新文件夹。在该音讯库文件夹中,您随后将积存此处突显的第四个PL/SQL 过程中创设的 XML 文书档案。第二个 PL/SQL 进程首首发出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周到据构建 XML。对于 XQuery
表达式(XMLQuery 在那边将其看作参数)而言,请小心嵌套的 FLWOTiggo表明式中动用的 ora:view XQuery 函数。在该示例中,ora:view
获取两个输入参数,即“H昂科拉”和“employees”,它们提醒该函数查询属于 HSportage数据库格局的职员和工人表。由此,ora:view 将赶回二个象征 HGL450.employees
表行的职员和工人 XML
文书档案类别。但为了省去结果文书档案中的空间,只将前多少个职员和工人记录传递给结荚类别。那是透过在
FLWO兰德酷路泽 表达式的 where 子句中钦定 $i/EMPLOYEE_ID <= 102
而达成的。请留意 FLWO奥迪Q7 表达式的 return 子句中使用的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的这七个 XQuery
表明式不仅将 XML
节点值转换为相应的连串,而且还将领到那一个节点值。随后,生成的职工 XML
文书档案作为 employees.xml 保存到在此以前在列表 1 中另3个 PL/SQL 进程中开创的
/public/employees XML 消息库文件夹。要力保此操作已做到,可实施以下查询:

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

在上述 XQuery 中,fn:doc XQuery 函数用于访问 Oracle XML DB
消息库中储存的单个 XML 文书档案。但如果要拍卖局地负有同等或一般结构的 XML
文书档案(存储在同一 XML
音讯库文件夹中),应该怎么办?那种景观下,另二个用来拍卖 XML
新闻库能源的 XQuery 函数(即
fn:collection)只怕会派上用场。本文稍后将介绍多少个关于怎么着运用
fn:collection XQuery 函数的言传身教。

该协会应生成以下输出:

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

你已经在本文领悟到,XQuery
是3个归结的查询语言,它提供了一种用于查询、构建和转换 XML
数据的短平快方法。即使 Oracle XQuery 实施使你能够操作任何能够用 XML
表示的数码(无论它存款和储蓄在数据库中、位于网站上大概存款和储蓄在文件系统中),但将处理的多少移动到数据库中一贯是四个毋庸置疑的呼吁。对于数据库中贮存的数据,Oracle
XML DB(对 XPath
重写使用同一机制)只可以眼看优化处理那个基于以下数据营造的 XQuery
表明式:这一个多少包蕴关周密据、对象-关周详据或行使结构化(对象-关系)存款和储蓄技术存款和储蓄的基于
XML 情势的 XMLType 数据。

XQuery 使你可以操作基于 XML
方式以及非基于形式的多少。以下示例演示了如何利用 XMLTable 函数从 OE
演示数据库方式中查询基于 PurchaseOrder XML 情势的 XMLType 表。

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

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

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

根据关周全据营造 XML

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