大雀软件园

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

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

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

将动静变量绑定到 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")/rowwhere $i/employee_id = $empnoreturn ({$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 中表露的剧本应天生以次输入(提防,欣赏器中大概不会表露标志): 100skingad_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 frompurchaseorder where existsnode(object_value,

'/purchaseorder[user = "eabel"]') = 1;

之上查问将处置用户 eabel 乞求的一切订单(即保存在 xmltype 的默许 purchaseorder 表中的订单)并将天生与查问 xmltype 数据局部中的 xquery 查问沟通的输入。

将列表 4 中的 ordertotal xslt 款式表与查问 xmltype 数据局部中的示例运用的 xquery 表白式举行比拟,您大概会提防到,xquery 本领要比 xslt 本领更具吸吸力。起码在运用 xquery 时,您只需编写很少的代码即可赢得沟通的最闭幕果。

查问 rss 消息供给

因为 rss 消息供给实质上是一个托管的 xml 文献(rss 消息观赏器居中获得头条消息或其余实质),所以不妨像处置任何其余不妨经过 web 赢得的 xml 文书档案那么来处置它。正如您在正文前方的查问外部数据源局部中所见,不妨运用 xquery 查问任何不妨经过 url 考察的 xml。您经过 xmltable 和 xmlquery sql 因变量中的 passing 子句动静绑定一切外部 xml 数据源。以次是一个查问 rss 消息供给的 xquery 示例:

select xmlquery('for $i in $h//channelreturn;{$i/lastbuilddate}{for $j in $h//itemwhere 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 gmthttp://www.oracle.com/technology/xehttp://www.oracle.com/technology/pub/articles/oracle_php_cookbookhttp://www.oracle.com/technology/tech/php/zendcore/index.html

但在开拓本质运用步调时,您将很大概须要 xquery 表白式径直天生 html 标志,而不是只是天生一个如上所示的 xml 文书档案。如许,您便不妨建立一个更精巧、可保护性更高的运用步调,因为是在这种情景下,一切 rss 处置(从索取需要的数据到将它包装在 html 标志中)都将变化到数据库。这使您不用编写控制 rss 处置的运用步调代码。本质上这表示着您不用在诸如 rss 消息供给的构造仍旧变动的情景下窜改运用步调代码。差异,您只需窜改用来 rss 处置的 xquery 表白式。

归纳

您仍旧在正文领会到,xquery 是一个归纳的查问谈话,它供给了一种用来查问、建立和变换 xml 数据的高效本领。纵然 oracle xquery 实行使您不妨操纵任何不妨用 xml 表白的数据(不管它保存在数据库中、坐落网站上仍旧保存在文献体例中),但将处置的数据挪动到数据库中一直是一个不错的办法。对于数据库中保存的数据,oracle xml db(对 xpath 重写运用同一体制)只能明显优化处置那些鉴于以次数据建立的 xquery 表白式:那些数据囊括联系数据、东西-联系数据或运用构造化(东西-联系)保存本领保存的鉴于 xml 形式的 xmltype 数据。

热门阅览

最新排行

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