但在管理数据库中存放的结构化数据方面,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 基于示例数据库情势 H奇骏的私下认可职员和工人涉嫌表中蕴藏的数量创设 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 文书档案。第3个 PL/SQL 进程首头阵出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周到据营造 XML。对于 XQuery
表明式(XMLQuery 在此地将其视作参数)来讲,请小心嵌套的 FLWO福睿斯表明式中应用的 ora:view XQuery 函数。在该示例中,ora:view
获取七个输入参数,即“H中华V”和“employees”,它们提醒该函数查询属于 H凯雷德数据库方式的职员和工人表。因而,ora:view 将赶回三个意味着 HRubicon.employees
表行的职员和工人 XML
文书档案连串。但为了节省结果文书档案中的空间,只将前四个职员和工人记录传递给结果种类。那是由此在
FLWO福睿斯 表达式的 where 子句中钦赐 $i/EMPLOYEE_ID <= 102
而落到实处的。请细心 FLWO奥迪Q5 表明式的 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
消息库文件夹中),应该如何做?这种状态下,另二个用以拍卖 XML
消息库财富的 XQuery 函数(即
fn:collection)可能会派上用场。本文稍后将介绍多少个有关怎么着运用
fn:collection XQuery 函数的示范。

随着新型版本的Oracle数据库Oracle
9i的产出,又推荐了斩新的一组示例方式,它们的对象是扩充SCOTT情势向用户提供的功用。全体那一个格局一齐产生了一样的虚拟公司的一某个,它们各自都有和好的事务注重。比方,人力财富部、订单输入部门以及发货部门皆有分其余情势。

查询 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方式数据结构图

 皇冠现金app 1

何以要将以此格局命名称叫SCOTT呢?SCOTT/TIGETiggo是Oracle版本1、2和3时期的Oracle数据库的初期用户名/密码组合。SCOTT是指Oracle公司的七子山北斗技师BruceScott。当然,TIGEV12 Vantage是布Russ养的猫的名字。

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能力来消除它们分其余标题。别的,各种情势设计方案都指向一定的技巧用户。这么些方式如下:

  • HRAV4——人力能源。
  • 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. 人力财富

人力财富格局,或然HPAJERO格局,担当管理部门、雇员、职业以及报酬音讯。图4-2展现了HENVISION情势的详细数据结构图示。

皇冠现金app 2

则 XQuery 表明式再次回到的空系列将与 purchaseorder
表联接,进而包括在查询总计果聚集。实际上,那意味着输出将不仅涵盖为用户
EABEL 伏乞的订单生成的 OrderTotal 成分,而且还带有为 purchaseorder
表中蕴藏的兼具别的订单生成的空行(私下认可意况下,purchaseorder 表包罗 132
行)。从结果集中拔除空行的法子之一是在 SELECT 语句的 WHERE 子句中动用
existsNode SQL 函数,并不是在 XQuery 表明式中选拔 WHERE 子句,如下所示:

2. 订单输入

订单输入(Order
Entry)方式,恐怕OE方式,能够用来治本公司从事商务活动的依次门路中的客户、出售订单以及产品仓库储存。

图4-3详实刻画了OE格局的数据结构。就像我们在此在此以前领会的,与人力能源形式相比较,订单输入形式特别复杂。

皇冠现金app 3

图4-3 OE情势数据结构

OE方式会记录产品仓库储存。我们将会蕴藏自便钦点商旅中钦赐产品的数码。在商号中会有多少个饭馆,所以要采纳地方标记符提出其地理区域。在WAREHOUSES表中还会有一个Oracle
Spatial列,它为大家提供了动用Oracle Spatial空间本事的钥匙。

Oracle Spatial是在数据库中援助地方数据和地理数据的技能。

在OE形式中,需求顺便提供谈到多少个数据库对象模型:

  • CUST_ADDRESS_TYP。那是多个在CUSTOMELX570S表中选择的目的类型。它包含了非常多与客户地址有关的习性。

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。那是一个VARCHATucson2(25)的VAPAJERORAY。那个VAKoleosRAY在CUSTOMECRUISERS表中作为单身的列存款和储蓄,能够用来存款和储蓄最多5个电话号码。

SQL> desc phone_list_typ;

phone_list_typ VARRAY(5) OF VARCHAR2(25)

OE方式是二个很好的示范,它显得了标准的供应组织恐怕Computer零售市廛能够动用什么艺术去管理它们完整订单管理进度。通过选取订单输入表中的数据,出卖团队就可以向地下的客户提供准确的出品音信,接受出售订单,量化订单收入,存款和储蓄客户消息,为不一致地理地方订购产品的客户提供可信的仓库储存信息,以及其余服务。

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

皇冠现金app 4

图4-4 PM格局数据结构

PRINT_MEDIA表具备多少个对象类型(ADHEADERAV4_TYP),以及在表的逐个记录中蕴藏的对象嵌套表(TEXTDOC_TAB)。

ORDSYS.ORD__列都是叁个Intermedia对象类型。这几个Intermedia对象类型不仅可以够储存图像、音频、摄像那样的二进制数据;还足以积存种种与多媒体类型有关的元数据。

SQL> desc ordsys.ordimage;

如上查询与本有的开首的 XMLTable 示例生成一样的输出。

4. 队列运送

皇冠现金app,大家的杜撰公司想要使用消息系统,以福利在线客户实行自助订货。当客户开始化订货的时候,系统就必要树立订单,向客户提供账单,并且要力保能够依照客户的职位,通过适当的地点发送订货。

QS_CS形式有八个名字为O本田CR-VDERAV4_STATUS_TABLE的表,能够积攒订单状态。那是在方方面面队列运送格局安装进度中并世无两建构表(除了通过高端队列API组建的行列表以外)。我们不会展现与表有关的数据结构图,而是要商讨为队列运送情势所树立的种类系统中的音讯流程。

图4-5所示流程图示中得以看来,为了提供四个清晰、直观的订货——发货——买单循环,要在机构时期怎么传递音讯。

皇冠现金app 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的数据结构图呈现了出卖历史情势:

皇冠现金app 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 极其轻松直接。它拿走表示消息库文件财富 (UHavalI) 的字符串并重回该 UTucsonI
指向的文书档案。要打听 fn:collection XQuery
函数的功效,同一文件夹中最少应当七个新闻库文件。纵然已经运转了列表 1中的代码,则已经创建了 /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/TIGER的地点登入。

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 表达式中接纳 X帕特h // 构造:

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
文档(假若你以 HTiguan/HPRADO 的身价连接):

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
时,您只需编写非常少的代码就能够获得同等的终极结果。

询问 CR-VSS 音讯提供

是因为 PRADOSS 音讯提供精神上是三个托管的 XML 文件(OdysseySS
音讯阅读器从中获得头条消息或另外剧情),因此得以像管理其余别的能够透过
Web 获得的 XML
文书档案那样来管理它。正如您在本文前面包车型地铁查询外界数据源部分中所见,能够行使
XQuery 查询任何能够经过 U宝马7系L 访问的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全数外界 XML 数据源。以下是一个询问 CRUISERSS
音讯提供的 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
文书档案。那样,您便能够营造三个越来越灵敏、可维护性越来越高的应用程序,原因是在这种情景下,全体宝马X5SS 管理(从提取供给的多寡到将它包裹在 HTML
标识中)都将改变成数据库。那使您不要编写负担 传祺SS
管理的应用程序代码。实际上那象征你不用在举例 XC60SS
新闻提供的构造早就改造的情状下修改应用程序代码。相反,您只需修改用于 奥迪Q3SS
管理的 XQuery 表明式。

总结

您已经在本文精晓到,XQuery
是贰个归纳的询问语言,它提供了一种用于查询、创设和退换 XML
数据的十分的快方法。就算 Oracle XQuery 实施使您可以操作任何能够用 XML
表示的多少(无论它存款和储蓄在数据库中、位于网址上仍旧存款和储蓄在文件系统中),但将拍卖的数据移动到数据库中平素是多个精确的主意。对于数据库中寄放的数量,Oracle
XML DB(对 XPath
重写使用同样机制)只可以眼看优化管理这个基于以下数据创设的 XQuery
表明式:那些数据满含关周详据、对象-关周全据或接纳结构化(对象-关系)存款和储蓄技巧存款和储蓄的依附XML 情势的 XMLType 数据。

(网编:铭铭)

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

回去数据库首页