Oracle编制程序入门卓绝,创设和转变XML

Oracle 九i产品帮助文书档案:

在 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 数据库 拾g 第 贰版在此之前的版本中完结此职务,常常须要选择 SQL/XML 生成函数,如
XMLElement、XMLForest 和 XMLAgg()。在 Oracle 数据库 十 g 第 二版中,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;
/

 

在列表 一 中的第3个 PL/SQL 进程中,您只是在 XML
音讯库中成立了三个新文件夹。在该音信库文件夹中,您随后将累积此处展现的第二个PL/SQL 进程中创立的 XML 文书档案。第二个 PL/SQL 进程首头阵出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周密据创设 XML。对于 XQuery
表明式(XMLQuery 在此间将其看成参数)来讲,请小心嵌套的 FLWO景逸SUV表明式中运用的 ora:view XQuery 函数。在该示例中,ora:view
获取多少个输入参数,即“H宝马X5”和“employees”,它们提示该函数查询属于 H大切诺基数据库形式的职员和工人表。由此,ora:view 将赶回一个象征 HCRUISER.employees
表行的职员和工人 XML
文书档案种类。但为了节约结果文书档案中的空间,只将前五个职工记录传递给结荚类别。那是通过在
FLWO景逸SUV 表明式的 where 子句中钦点 $i/EMPLOYEE_ID <= 102
而完成的。请留意 FLWOCR-V 表明式的 return 子句中利用的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的那三个 XQuery
表达式不仅仅将 XML
节点值调换为相应的体系,而且还将提取那个节点值。随后,生成的职员和工人 XML
文书档案作为 employees.xml 保存到事先在列表 一 中另三个 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
九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逆向工程转换为数据库模型)。

图4-壹 SCOTT方式数据结构图

 图片 1

缘何要将以此情势命名称为SCOTT呢?SCOTT/TIGE猎豹CS陆是Oracle版本1、二和三时期的Oracle数据库的前期用户名/密码组合。SCOTT是指Oracle公司的长者程序猿Bruce斯科特。当然,TIGE讴歌MDX是Bruce养的猫的名字。

SCOTT情势中所展示的数据库特性凉日被感到是绝大多数关全面据库产品中的重要特色。假设想要真实地展现Oracle数据库的效率,就要强化那么些示例!

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

EABEL-20021009123338324PDT
1328.05


EABEL-20021009123335791PDT
2067.15


EABEL-20021009123336251PDT
289.6


EABEL-20021009123336382PDT
928.92

4.2 Oracle 九i示例情势

Oracle技能能够利用于各样区别的条件中。技术消除方案的四个使用极端气象是,高速在线事务管理和数据库宾馆。就算用户能够选择3个方式,展示什么在同样的表中完毕在线事务处理和数据仓库。然而用户不用或然选择这种措施贯彻实用的解决方案。我们在今后的产业界中平常能够开采,为了化解实际世界中的区别总括须要,常常在单身的数据库实例中会存在差异的情势,可能在互连网上会有恢宏遍布式数据库。新的Oracle
玖i示例方式模型极好地对那么些现象建立模型。

Oracle
九i示例情势试图模型化3个现实世界中装有一文山会海规范业务部门的行销团队。那么些差别的机关有着分歧的音信才干要求,每3个演示形式都接纳了分歧的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(如下所示):

肆.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宝马X3方式,担负管理部门、雇员、职业以及薪给音信。图④-贰来得了H昂Cora情势的详尽数据结构图示。

图片 2

则 XQuery 表明式重回的空种类将与 purchaseorder
表联接,从而包涵在询问计算果聚焦。实际上,那表示输出将不止含有为用户
EABEL 请求的订单生成的 OrderTotal 元素,而且还富含为 purchaseorder
表中存款和储蓄的具有其他订单生成的空行(私下认可景况下,purchaseorder 表包括 13二行)。从结果聚集清除空行的措施之一是在 SELECT 语句的 WHERE 子句中运用
existsNode SQL 函数,而不是在 XQuery 表明式中央银行使 WHERE 子句,如下所示:

2. 订单输入

订单输入(Order
Entry)情势,可能OE格局,能够用来保管集团从事商务活动的一1渠道中的客户、发卖订单以及产品仓库储存。

图四-三详尽刻画了OE方式的数据结构。就像是大家原先精晓的,与人力能源情势比较,订单输入形式越发复杂。

图片 3

图四-三 OE情势数据结构

OE形式会记录产品仓库储存。大家将会积攒任性钦赐饭店中钦命产品的数量。在商号中会有多个客栈,所以要运用地方标记符提议其地理区域。在WAREHOUSES表中还有一个Oracle
Spatial列,它为大家提供了接纳Oracle Spatial空间工夫的钥匙。

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

在OE方式中,须要顺便提供聊起多少个数据库对象模型:

  • CUST_ADDRESS_TYP。那是3个在CUSTOMEOdysseyS表中利用的指标类型。它包括了无数与客户地址有关的属性。

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。那是二个VAQashqaiCHARubicon2(2伍)的VA景逸SUVRAY。那些VAPRADORAY在CUSTOME奥德赛S表中作为独立的列存款和储蓄,能够用来存款和储蓄最多多少个电话号码。

SQL> desc phone_list_typ;

phone_list_typ VARRAY(5) OF VARCHAR2(25)

OE方式是一个很好的示范,它显得了正式的供应协会大概计算机零售公司能够采Nash么方法去管理它们完整订单管理进程。通过行使订单输入表中的数据,发售团队就足以向地下的客户提供可靠的出品新闻,接受发售订单,量化订单收入,存款和储蓄客户新闻,为不相同地理地点订购产品的客户提供标准的库存音信,以及别的服务。

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形式,用于管理描述公司产品的多媒体数据。摄像、音频和图像这样的在线媒体都得以随输出的传播媒介数据类型存款和储蓄在数据库中。那是大家要非常商量的方式之壹,它器重于多媒体内容,以及Oracle
Intermedia所提供的意义。

注意:

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

而外Intermedia数据存款和储蓄以外,PM情势还特别注重LOB列类型的利用来囤积数据。

出品媒人体模型式是Oracle 玖i使用名叫Oracle
Intermedia的Oracle手艺化解现实世界商务须求的精粹示例。比方,大家虚构的信用社就足以积攒多媒体数据恐怕输出多媒体数据。由此,产品媒人体模型式中的示例能够成功如下职业:

  • 为Oracle中选择Web公布的剧情存款和储蓄缩略图和完全尺寸的图像。
  • 在Oracle中累积音频剪辑。
  • 在Oracle中积累录像剪辑。
  • 对图像类型举行管理,以便调换来与Web包容的图像类型

选拔Oracle
Intermedia,一些早已很难达成的天职就变得相对简便易行。图4-4象征为产品媒人体模型式,以及它对订单输入表PRODUCT_INFORMATION的引用。

图片 4

图四-四 PM情势数据结构

PRINT_MEDIA表具备叁个目的类型(ADHEADE福睿斯_TYP),以及在表的逐壹记录中贮存的对象嵌套表(TEXTDOC_TAB)。

ORDSYS.ORD__列都以一个Intermedia对象类型。那些Intermedia对象类型不止能够蕴蓄图像、音频、录制那样的2进制数据;还足以积攒各样与多媒体类型有关的元数据。

SQL> desc ordsys.ordimage;

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

4. 行列运送

大家的虚拟公司想要使用新闻系统,以便于在线客户举办自助订货。当客户伊始化订货的时候,系统就必要树立订单,向客户提供账单,并且要力保能够依靠客户的职位,通过适当的地带发送订货。

QS_CS格局有3个名字为OSportageDEENCORE_STATUS_TABLE的表,能够积存订单状态。那是在全路队列运送方式安装进程中唯第一建工公司立表(除了通过高级队列API营造的连串表以外)。大家不会体现与表有关的数据结构图,而是要研商为队列运送方式所树立的行列系统中的新闻流程。

图4-5所示流程图示中得以观望,为了提供二个清晰、直观的订购——发货——付钱循环,要在单位时期什么传递新闻。

图片 5

图四-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)正是用来说述在进展裁定的进度中国国投息本领利用的术语。

出售历史方式是三个思想数据仓库的演示。表会依照正方形形式(star
schema)设计进行集体,在这种措施下,会有二个大的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 文书档案。

四.2.二 渐进学习格局

循序渐进不相同的受众组织方式的不二等秘书技得以鼓励新的Oracle用户通过结构化的方法学习手艺。譬如,初学者能够从人力资源开首。那足以让她熟知关系概念、查询数据、数据库操作语言、数据库定义语言、以及部分别的基本概念。

当新Oracle用户纯熟了人力能源格局之后,能够延续剖判订单输入情势。在这么些新形式中,他将会超出对象类型、XML支持、Oracle
Spatial、以及其余部分比较高等的数据库本性。

接下去,用户能够剖析任何形式所提供的特定领域。多媒体育专科高校家能够深深学习产品媒体情势。设计算与发放表-订阅型基于音讯的系统的用户可以窥见,队列运送形式在他们起头学习Oracle高等队列的时候将会极度有赞助。数据饭店的热衷者最佳去剖判和领悟卖出去历史情势。

正如本文在此以前(参阅使用关全面据营造 XML部分)介绍的示范所示范,使用
fn:doc 特别轻松直接。它赢得表示音讯库文件财富 (U昂CoraI) 的字符串并再次来到该 UKoleosI
指向的文书档案。要询问 fn:collection XQuery
函数的效果,同一文件夹中足足应该四个音讯库文件。即使已经运维了列表 1中的代码,则早就创办了 /public/employees 消息库文件夹并在中间蕴藏了
employees.xml 文件。因而,您将须求在该公文夹中最少再制造多少个 XML
文件,然后工夫试用 fn:collection。列表 贰 中的 PL/SQL 代码基于
SCOTT/TIGEBMWX三 演示数据库情势的 dept 和 emp 表存款和储蓄的关周密据创设XML,然后将转换的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees
音讯库文件夹。要运转列表 二 中的 PL/SQL 进程,请确认保证以 SCOTT/TIGE奥迪Q三的身价登陆。

四.2.3 发现更加多关于示例格局的从头到尾的经过

列表 二:基于关周全据创设 XML 并将其保存到 XML 新闻库

一. 数据库对象描述

在那某当中,大家将会浏览数据库,找到属于示例形式下的对象,然后利用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提供了一种能够让表的持有者在数据库中存储表或许列的纯文本注释的方法。在示范格局安装时期,每一个形式都怀有贰个剧本,可认为它们各自的表和列建设构造这个注释。那能够利用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 将 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
看到的文书档案)中创设2个职工文件夹,然后在该公文夹中插入 empsbonus.xml
文件,以便能够经过以下 U中华VL 访问 empsbonus.xml 文件:

http://localhost/employees/empsbonus.xml

接下去,要是您需求基于 empsbonus.xml
文书档案中积存的数量成立1个报表。在该报表中,您可能不止要含有列表中突显的奖金数额以及种种职员和工人的职员和工人ID,还要包蕴他/她的人名。因而,能够率先使用以下查询生成叁个新的 XML
文书档案(假如你以 HRubicon/HMurano 的身价连接):

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;

以上查询是3个有关怎样行使 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 第 二 版 (十.二) 文书档案中《SQL\Plus
用户指南和参照》一书中的“调节SQL\Plus”一章。以下示例演示了怎么通过检查 EXPLAIN PLAN
生成的执行陈设来赢得利润。即使你曾经将 PLUSTRACE 剧中人物赋予私下认可用户 OE,以
OE/OE 的身份登6并运营以下查询:

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
调节的要紧对象是幸免访问对结果未有其它影响的行,因而只怕要持续调治查询以优化品质。对查询中涵盖的
X帕特h 表明式进行再一次建立模型后,能够重新重试它,如下所示:

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。列表 三中的示例演示了如何在从 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 不但可用来将一个 XML
文书档案转变为另二个 XML 文书档案,而且还可用于将 XML
转变为另一种基于文本的格式,如 HTML 或 WML。

在本文前边的询问 XMLType 数据部分中,您看看了一个有关使用 XQuery 将叁个XML 文书档案调换为另二个 XML 文书档案的身体力行。具体来讲,该示例使用 XQuery
表明式总结示例数据库格局 OE 的 purchaseorder
表中积存的订单的订单1共,然后为处理的各种订单生成了1个 OrderTotal XML
成分。实际上,您能够运用 XSLT
实践同样操作。为此,您首先要求成立1个使用于 PurchaseOrder XML 文书档案的
XSLT 样式表,以调换对应的 OrderTotal 成分。对于此示例,可以应用列表 四中所示的 XSLT 样式表。

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

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



























为方便起见,您只怕供给将此 XSL
样式表保存在数据库中,然后再起来采取它。比如,您可以将样式表作为文件能源保存在
Oracle XML DB
消息库中。推行该操作的章程之1是将样式表作为文件保留到地面文件系统中,然后利用以下某些互连网球组织议将它移动到
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
时,您只需编写很少的代码就可以得到1致的末段结出。

查询 TucsonSS 新闻提供

鉴于 CR-VSS 音讯提供精神上是一个托管的 XML 文件(OdysseySS
音信阅读器从中获得头条音信或别的剧情),由此得以像管理其余别的可以因此Web 得到的 XML
文书档案那样来拍卖它。正如您在本文前边的查询外部数据源部分中所见,能够接纳XQuery 查询别的能够通过 U奥迪Q5L 访问的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全数外部 XML 数据源。以下是七个查询 陆风X8SS
音讯提供的 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 应生成2个 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
文档。那样,您便足以创设一个更加灵敏、可维护性越来越高的应用程序,原因是在这种气象下,全体索罗德SS 管理(从提取须求的数额到将它包裹在 HTML
标志中)都将转移到数据库。那让你不用编写担负 福睿斯SS
管理的应用程序代码。实际上那表示你不要在诸如 奥德赛SS
消息提供的组织已经转移的情事下修改应用程序代码。相反,您只需修改用于 GL450SS
管理的 XQuery 表明式。

总结

你已经在本文理解到,XQuery
是多个综合的查询语言,它提供了1种用于查询、塑造和更改 XML
数据的长足方法。固然 Oracle XQuery 实行让你能够操作任何能够用 XML
表示的数目(无论它存款和储蓄在数据库中、位于网址上依然存储在文件系统中),但将拍卖的多寡移动到数据库中平昔是一个没有错的主张。对于数据库中蕴藏的数目,Oracle
XML DB(对 X帕特h
重写使用同一机制)只可以眼看优化处理那么些基于以下数据创设的 XQuery
表明式:这一个数据包含关周详据、对象-关周详据或采用结构化(对象-关系)存款和储蓄技能存储的基于
XML 方式的 XMLType 数据。

(主编:铭铭)

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

回去数据库首页

相关文章