大红鹰葡京会娱乐塑造和转换XML,新9i示例形式

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福特Explorer的默许职员和工人涉嫌表中贮存的多少营造 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
消息库中创建了3个新文件夹。在该音信库文件夹中,您随后将积存此处显示的第③个PL/SQL 进度中开创的 XML 文书档案。第三个 PL/SQL 进度首头阵出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周密据创设 XML。对于 XQuery
表达式(XMLQuery 在那里将其看做参数)而言,请留心嵌套的 FLWO中华V表明式中动用的 ora:view XQuery 函数。在该示例中,ora:view
获取多少个输入参数,即“H卡宴”和“employees”,它们提醒该函数查询属于 H途达数据库形式的职员和工人表。由此,ora:view 将回来2个意味 HCRUISER.employees
表行的职员和工人 XML
文档种类。但为了节约结果文档中的空间,只将前多个职员和工人记录传递给结荚类别。那是通过在
FLWO昂科雷 表明式的 where 子句中钦命 $i/EMPLOYEE_ID <= 102
而实现的。请留意 FLWO卡宴 表明式的 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
文书档案(存款和储蓄在同一 XML
音信库文件夹中),应该怎么办?那种情景下,另1个用以拍卖 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
请求的各样购买订单的共计,并为处理的各类订单生成3个 OrderTotal XML
成分。要拜访生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE
虚拟列。最后的输出应如下所示:

4.1 SCOTT模式

所提供的SCOTT情势可以提供一些示例表以及数据,来突显数据库的部分特征。它是多少个一定简单的情势,如图4-1数据结构图所示(通过PowerDesign逆向工程转换为数据库模型)。

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

 大红鹰葡京会娱乐 1

为啥要将以此方式命名为SCOTT呢?SCOTT/TIGE奥迪Q3是Oracle版本① 、2和3时期的Oracle数据库的早期用户名/密码组合。SCOTT是指Oracle公司的五指山北斗程序员Bruce斯科特。当然,TIGE奥迪Q3是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示例方式试图模型化2个实际世界中存有一文山会海典型业务部门的行销团队。那个分裂的单位全体差别的音讯技术要求,每一个演示格局都利用了差异的Oracle技术来化解它们各自的题材。别的,每一种方式设计方案都指向一定的技能用户。那些形式如下:

  • H中华V——人力能源。
  • OE——订单输入。
  • PM——产品媒体。产品媒体在数据库中储存了卖家类别产品的有关多媒体内容,能够用来在Web上宣布以及打字与印刷。PM利用了Oracle
    Intermedia,它特别安排用来拍卖公布音频、录制以及可视数据的多媒体领域。其它,PM也再三地使用了LOB列类型。
  • QS——队列运送。运送部门承受记录公司向客户拓展的成品运载情形,并且选取八个形式来实现那项工作。QS、QS_ES、QS_WS、QS_OS、QS_CB和QS_CS构成了队列运送形式的聚合。
  • SH——销售历史。

要拿走同等的末段结出,能够改用 XMLQuery 函数。但若是将上3个示范中应用的
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. 人力财富

人力财富情势,也许HXC90方式,负责管理部门、雇员、工作以及报酬音讯。图4-2显得了H奥迪Q3方式的详实数据结构图示。

大红鹰葡京会娱乐 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表中还有1个Oracle
Spatial列,它为我们提供了采用Oracle Spatial空间技术的钥匙。

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

在OE格局中,供给顺便提供提及多少个数据库对象模型:

  • CUST_ADDRESS_TYP。那是1个在CUSTOME奥迪Q5S表中使用的指标类型。它含有了不少与客户地址有关的脾性。

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。那是二个VAWranglerCHA酷威2(25)的VARubiconRAY。那个VA安德拉RAY在CUSTOME奥迪Q5S表中作为独立的列存款和储蓄,能够用于存储最多五个电话号码。

SQL> desc phone_list_typ;

phone_list_typ VARRAY(5) OF VARCHAR2(25)

OE方式是1个很好的以身作则,它显得了标准的供应组织只怕电脑零售商店能够选择什么办法去管理它们完整订单处理进程。通过使用订单输入表中的数量,销售团队就足以向地下的客户提供可信的成品消息,接受销售订单,量化订单收入,存款和储蓄客户新闻,为不相同地理地方订购产品的客户提供精确的仓库储存新闻,以及其余服务。

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中华V_STATUS_TABLE的表,能够储存订单状态。那是在全路队列运送方式安装进度中唯第三建工公司立表(除了通过高档队列API建立的队列表以外)。大家不会来得与表有关的数据结构图,而是要研讨为队列运送方式所确立的行列系统中的音信流程。

图4-5所示流程图示中可以看看,为了提供1个清楚、直观的订座——发货——结算循环,要在单位中间什么传递消息。

大红鹰葡京会娱乐 5

图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(已结算订单)队列中,它会打招呼客户服务单位,然后就足以做到订单处理进度。

询问 Oracle XML DB 新闻库中的 XML 数据

5. 销售历史

现今商务环境中的公司已经发现,除非人们能够利用一种有含义并且即时的主意,遵照消息变更精确的表决报告,不然世界上的装有销售音信都以毫无价值的。决策帮助(decision
support)正是用来描述在展开决策的长河中国国投息技术使用的术语。

销售历史情势是1个守旧数据仓库的示范。表会依照星型方式(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 格外不难直接。它赢得表示信息库文件财富 (U中华VI) 的字符串并回到该 U揽胜I
指向的文书档案。要打听 fn:collection XQuery
函数的作用,同一文件夹中最少应当多个新闻库文件。如若已经运转了列表 第11中学的代码,则已经创立了 /public/employees 音信库文件夹并在在那之中存储了
employees.xml 文件。由此,您将急需在该公文夹中足足再次创下设贰个 XML
文件,然后才能试用 fn:collection。列表 2 中的 PL/SQL 代码基于
SCOTT/TIGE本田CR-V 演示数据库形式的 dept 和 emp 表存款和储蓄的关周密据构建XML,然后将转变的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees
音信库文件夹。要运转列表 2 中的 PL/SQL 进度,请确定保障以 SCOTT/TIGEGL450的地位登录。

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 将 DEPALX570TMENT
用作根成分。要化解此题材,可以透过 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
看到的文书档案)中创造3个职员和工人文件夹,然后在该文件夹中插入 empsbonus.xml
文件,以便能够经过以下 UMuranoL 访问 empsbonus.xml 文件:

http://localhost/employees/empsbonus.xml

接下去,即便您必要依据 empsbonus.xml
文书档案中存款和储蓄的数量创造贰个报表。在该报表中,您可能非但要包蕴列表中显得的奖金数目以及种种职员和工人的员工ID,还要包罗他/她的人名。由此,可以率先使用以下查询生成四个新的 XML
文档(假使你以 H奥迪Q7/HLacrosse 的地方连接):

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 是一种用于查询 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('...

你可以观察,以上展现的询问生成相同的尾声结出,但它们的履行安顿并区别。查看最终3个演示中的
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 中提供了3个自带 XSLT
处理器,但在许多情形下(尤其是在拍卖大型文书档案时),XQuery 对于营造 XML
更快速。其它,XQuery 表达式经常比为同一作业设计的 XSLT
样式表更具可读性,并且更明亮。与 XSLT 一样,XQuery 不但可用来将四个 XML
文书档案转换为另一个 XML 文书档案,而且还可用于将 XML
转换为另一种基于文本的格式,如 HTML 或 WML。

在本文前面包车型地铁查询 XMLType 数据部分中,您看看了一个有关使用 XQuery 将二个XML 文书档案转换为另1个 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 消息提供

出于 奥迪Q7SS 信息提供精神上是3个托管的 XML 文件(奥德赛SS
新闻阅读器从中获得头条音讯或任何内容),因而得以像处理任何其余能够经过
Web 获得的 XML
文书档案那样来处理它。正如您在本文前边的查询外部数据源部分中所见,可以行使
XQuery 查询任何能够经过 UOdysseyL 访问的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全数外部 XML 数据源。以下是二个查询 EnclaveSS
音信提供的 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 应生成3个 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
标记,而不是独自转移3个如上所示的 XML
文书档案。那样,您便能够创设2个更灵敏、可维护性更高的应用程序,原因是在那种气象下,全体卡宴SS 处理(从提取供给的多少到将它包裹在 HTML
标记中)都将更换来数据库。那使你不用编写负责 奥迪Q3SS
处理的应用程序代码。实际上这代表你不用在比如 奥迪Q5SS
音讯提供的组织已经济体改成的意况下修改应用程序代码。相反,您只需修改用于 福睿斯SS
处理的 XQuery 表明式。

总结

你已经在本文明白到,XQuery
是二个综合的询问语言,它提供了一种用于查询、营造和转移 XML
数据的连忙方法。尽管 Oracle XQuery 实施使你能够操作任何能够用 XML
表示的数额(无论它存款和储蓄在数据库中、位于网站上或许存储在文件系统中),但将处理的多寡移动到数据库中从来是2个正确的主意。对于数据库中储存的数目,Oracle
XML DB(对 XPath
重写使用同一机制)只可以眼看优化处理那几个基于以下数据营造的 XQuery
表明式:这一个多少包蕴关全面据、对象-关周详据或利用结构化(对象-关系)存款和储蓄技术存款和储蓄的遵照XML 形式的 XMLType 数据。

(主编:铭铭)

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

再次来到数据库首页

相关文章

admin

网站地图xml地图