大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 数据库 -> Oracle XQuery查询、构建和转换XML(1)

Oracle XQuery查询、构建和转换XML(1)

时间: 2021-07-31 作者:daque

 在 oracle 数据库 10g 第 2 版中,oracle 引入了一个与该数据库集成的全功效自带 xquery 引擎,该引擎可用来实行与开拓扶助 xml 的运用步调关系的百般工作。xquery 是一种用来处置 xml 数据模子的查问谈话,它本质上可操纵任何典型的可用 xml 表白的数据。纵然 oracle xquery 实行使您不妨运用数据库数据和外部数据源,但在处置数据库中保存的构造化数据上面,oracle xml db 常常不妨明显普及本能。

正文供给的示例不只演练了在什么场所下以及怎样运用 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 鉴于示例数据库形式 hr 的默许职工联系表中保存的数据建立 xml 文书档案。

列表 1:运用 ora:view 鉴于联系数据创造 xml

beginif(dbms_xdb.createfolder('/public/employees')) thendbms_output.put_line('folder is created');elsedbms_output.put_line('cannot create folder');end if;commit;end;/

declarexmldoc xmltype;beginselect xmlquery('for $j in 1return ({for $i in ora:view("hr", "employees")/rowwhere $i/employee_id <= 102return ({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)) thendbms_output.put_line('resource is created');elsedbms_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 在此处将其用作参数)而言,请提防嵌套的 flwor 表白式中运用的 ora:view xquery 因变量。在该示例中,ora:view 获得两个输出参数,即“hr”和“employees”,它们引导该因变量查问属于 hr 数据库形式的职工表。所以,ora:view 将归来一个表白 hr.employees 表行的职工 xml 文书档案序列。但为了俭朴截止文书档案中的空间,只将前三个职工记载传播给截止序列。这是经过在 flwor 表白式的 where 子句中指定 $i/employee_id <= 102 而实行的。请提防 flwor 表白式的 return 子句中运用的 xs:string() 和 xs:integer() xquery 典型表白式。本质上,此处运用的这两个 xquery 表白式不只将 xml 节点值变换为相映的典型,并且还将索取那些节点值。随后,天生的职工 xml 文书档案动作 employees.xml 生存到之前在列表 1 中另一个 pl/sql 进程中创造的 /public/employees xml 消息库文献夹。要保证此操纵已实行,可实行以次查问:

select xmlquery('for $i in fn:doc("/public/employees/employees.xml")return;$i'returning content) as result from dual;

该查问应天生以次输入:

100king24000101kochhar17000102de haan17000

在之上 xquery 中,fn:doc xquery 因变量用来考察 oracle xml db 消息库中保存的单个 xml 文书档案。但即使要处置少许具备沟通或一致构造的 xml 文书档案(保存在同一 xml 消息库文献夹中),该当如何做?这种情景下,另一个用来处置 xml 消息库资源的 xquery 因变量(即 fn:collection)大概会派上用途。正文稍后将引见几个相关怎样运用 fn:collection xquery 因变量的示例。

查问 xmltype 数据

xquery 使您不妨操纵鉴于 xml 形式以及非鉴于形式的数据。以次示例演练了怎样运用 xmltable 因变量从 oe 演练数据库形式中查问鉴于 purchaseorder xml 形式的 xmltype 表。

select ttab.column_value as ordertotal from purchaseorder,xmltable('for $i in /purchaseorderwhere $i/user = "eabel"return;{$i/reference}{fn:sum(for $j in $i/lineitems/lineitem/partreturn ($j/@quantity*$j/@unitprice))}'passing object_value) ttab;

在之上示例中,您在 xmltable 因变量的 passing 子句中运用 object_value 假造列将 purchaseorder 表动作左右文项传播给此处运用的 xquery 表白式。xquery 表白式计划用户 eabel 乞求的每个购置订单的合计,并为处置的每个订单天生一个 ordertotal xml 元素。要考察天生的 xml,请运用 select 列表中的 column_value 假造列。最后的输入应如次所示:

ordertotal-------------------------------------------------------------eabel-20021009123338324pdt1328.05eabel-20021009123335791pdt2067.15eabel-20021009123336251pdt289.6eabel-20021009123336382pdt928.92

要赢得沟通的最闭幕果,不妨改用 xmlquery 因变量。但即使将上一个示例中运用的 xquery 表白式参数传播给 xmlquery(如次所示):

select xmlquery('for $i in /purchaseorderwhere $i/user eq "eabel"return {$i/reference}{fn:sum(for $j in $i/lineitems/lineitem/partreturn ($j/@quantity*$j/@unitprice))}'passing object_valuereturning content)from purchaseorder;

则 xquery 表白式归来的空序列将与 purchaseorder 表联接,进而包括在查问归纳果会合。本质上,这表示着输入将不只包括为用户 eabel 乞求的订单天生的 ordertotal 元素,并且还包括为 purchaseorder 表中保存的一切其余订单天生的空行(默许情景下,purchaseorder 表包括 132 行)。从截止会合废除空行的本领之一是在 select 语句的 where 子句中运用 existsnode sql 因变量,而不是在 xquery 表白式中运用 where 子句,如次所示:

select xmlquery('for $i in /purchaseorderreturn {$i/reference}{fn:sum(for $j in $i/lineitems/lineitem/partreturn ($j/@quantity*$j/@unitprice))}'passing object_valuereturning content) as ordertotalfrom purchaseorderwhere existsnode(object_value, '/purchaseorder[user = "eabel"]') = 1;

之上查问与本局部发端的 xmltable 示例天生沟通的输入。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.