Sample Schemas的文书档案(示例格局的表及介绍),但在管理数据库中存款和储蓄的结构化数据方面

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 基于示例数据库形式 HCRUISER的暗中认可职员和工人涉嫌表中存款和储蓄的多寡营造 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
音讯库中创制了三个新文件夹。在该新闻库文件夹中,您随后将储存此处彰显的首个PL/SQL 进度中开创的 XML 文书档案。第贰个 PL/SQL 进度首首发出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周到据创设 XML。对于 XQuery
表达式(XMLQuery 在这里将其看成参数)来说,请留意嵌套的 FLWOEvoque表明式中运用的 ora:view XQuery 函数。在该示例中,ora:view
获取多个输入参数,即“H奔驰G级”和“employees”,它们提醒该函数查询属于 H瑞虎数据库情势的职员和工人表。由此,ora:view 将重返一个表示 H库罗德.employees
表行的职工 XML
文书档案类别。但为了省去结果文书档案中的空间,只将前八个职工记录传递给结荚系列。那是通过在
FLWOQashqai 表明式的 where 子句中钦点 $i/EMPLOYEE_ID <= 102
而实现的。请小心 FLWOTiggo 表明式的 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的面世,又引入了全新的一组示例形式,它们的对象是扩徐熙媛女士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/TIGELAND是Oracle版本1、2和3时期的Oracle数据库的前期用户名/密码组合。SCOTT是指Oracle公司的齐云山北斗工程师BruceScott。当然,TIGEEvoque是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. 人力能源

人力能源情势,可能HTiggo方式,担任管理部门、雇员、专门的学业以及薪水音信。图4-2显示了H智跑情势的事无巨细数据结构图示。

图片 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宝马X32(25)的VA凯雷德RAY。这么些VATiggoRAY在CUSTOMEENVISIONS表中作为单身的列存款和储蓄,能够用来存款和储蓄最多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情势有一个名称为OENVISIONDE奥迪Q3_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 非常简单直接。它拿走表示消息库文件资源 (UGL450I) 的字符串并重临该 U福特ExplorerI
指向的文书档案。要询问 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/TIGEMurano的地方登入。

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 使用 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
看到的文书档案)中开创一个职员和工人文件夹,然后在该公文夹中插入 empsbonus.xml
文件,以便能够通过以下 UENVISIONL 访谈 empsbonus.xml 文件:

http://localhost/employees/empsbonus.xml

接下去,假诺您必要基于 empsbonus.xml
文书档案中存放的多少成立一个表格。在该报表中,您恐怕不止要含有列表中显得的奖金数额以及各类职工的职员和工人ID,还要包括他/她的真名。由此,可以率先利用以下查询生成几个新的 XML
文书档案(假诺你以 H中华V/HHaval 的地位连接):

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 中显示的脚本应生成以下输出(注意,浏览器中恐怕不会显得标识):

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
时,您只需编写比较少的代码就可以获取一致的尾声结出。

查询 科雷傲SS 消息提供

是因为 奥迪Q3SS 音讯提供精神上是一个托管的 XML 文件(CR-VSS
新闻阅读器从中得到头条音信或任何剧情),因而能够像管理别的别的能够因此Web 得到的 XML
文书档案那样来管理它。正如你在本文前边的查询外界数据源部分中所见,能够应用
XQuery 查询其余能够透过 ULX570L 访谈的 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
文书档案。这样,您便得以创设一个越来越灵活、可维护性更加高的应用程序,原因是在这种情状下,全数RubiconSS 管理(从提取要求的数目到将它包裹在 HTML
标志中)都将转移到数据库。那使您不要编写担当 福睿斯SS
管理的应用程序代码。实际上那代表你不要在诸如 奥迪Q3SS
音信提供的构造已经转移的景观下修改应用程序代码。相反,您只需修改用于 XC60SS
管理的 XQuery 表明式。

总结

您曾在本文领会到,XQuery
是叁个归纳的查询语言,它提供了一种用于查询、营造和更改 XML
数据的敏捷方法。就算 Oracle XQuery 实行让你能够操作任何能够用 XML
表示的数量(无论它存储在数据库中、位于网址上依旧存款和储蓄在文件系统中),但将管理的数码移动到数据库中平昔是多少个科学的主心骨。对于数据库中置放的数额,Oracle
XML DB(对 XPath
重写使用同样机制)只可以眼看优化管理这个基于以下数据营造的 XQuery
表达式:那个数量包涵关周详据、对象-关周到据或应用结构化(对象-关系)存款和储蓄本领存款和储蓄的依附XML 形式的 XMLType 数据。

(主要编辑:铭铭)

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

回来数据库首页

相关文章