明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

Oracle XQuery查詢、構(gòu)建與轉(zhuǎn)換XML(4)

[摘要]將動態(tài)變量綁定到 XQuery 表達式 另一種可以顯著提高 XQuery 表達式執(zhí)行性能的技術(shù)是使用綁定動態(tài)變量。使用綁定變量(而不是將變量串聯(lián)為字符串)可以使 Oracle 重用 SQL 語句,從而減少分析開銷并顯著提高應(yīng)用程序的性能?梢栽 XMLQuery 和 XMLTable SQL 函數(shù)...
將動態(tài)變量綁定到 XQuery 表達式

另一種可以顯著提高 XQuery 表達式執(zhí)行性能的技術(shù)是使用綁定動態(tài)變量。使用綁定變量(而不是將變量串聯(lián)為字符串)可以使 Oracle 重用 SQL 語句,從而減少分析開銷并顯著提高應(yīng)用程序的性能?梢栽 XMLQuery 和 XMLTable SQL 函數(shù)中使用 PASSING 子句將動態(tài)變量綁定到 XQuery 表達式。該技術(shù)使您可以根據(jù)客戶端代碼中計算的參數(shù)動態(tài)生成 XML。列表 3 中的示例演示了如何在從 PHP 腳本執(zhí)行的 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 中顯示的腳本應(yīng)生成以下輸出(注意,瀏覽器中可能不會顯示標記):
100

SKING

AD_PRES

XQuery 與 XSLT

盡管 Oracle 在 Oracle XML DB 中提供了一個自帶 XSLT 處理器,但在很多情況下(尤其是在處理大型文檔時),XQuery 對于構(gòu)建 XML 更高效。此外,XQuery 表達式通常比為同一作業(yè)設(shè)計的 XSLT 樣式表更具可讀性,并且更清楚。與 XSLT 一樣,XQuery 不但可用于將一個 XML 文檔轉(zhuǎn)換為另一個 XML 文檔,而且還可用于將 XML 轉(zhuǎn)換為另一種基于文本的格式,如 HTML 或 WML。

在本文前面的查詢 XMLType 數(shù)據(jù)部分中,您看到了一個有關(guān)使用 XQuery 將一個 XML 文檔轉(zhuǎn)換為另一個 XML 文檔的示例。具體而言,該示例使用 XQuery 表達式計算示例數(shù)據(jù)庫模式 OE 的 purchaseorder 表中存儲的訂單的訂單總計,然后為處理的每個訂單生成了一個 OrderTotal XML 元素。實際上,您可以使用 XSLT 執(zhí)行相同操作。為此,您首先需要創(chuàng)建一個應(yīng)用于 PurchaseOrder XML 文檔的 XSLT 樣式表,以生成相應(yīng)的 OrderTotal 元素。對于此示例,可以使用列表 4 中所示的 XSLT 樣式表。

列表 4:使用 XSLT 計算小計總和 (Quantity * UnitPrice)



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































































為方便起見,您可能需要將此 XSL 樣式表保存在數(shù)據(jù)庫中,然后再開始使用它。例如,您可以將樣式表作為文件資源保存在 Oracle XML DB 信息庫中。執(zhí)行該操作的方法之一是將樣式表作為文件保存到本地文件系統(tǒng)中,然后使用以下某個互聯(lián)網(wǎng)協(xié)議將它移動到 XML 信息庫:FTP、HTTP 或 WebDAV。假設(shè)您已經(jīng)將列表 4 中的 XSLT 樣式表作為 orderTotal.xsl 保存在 /public 信息庫文件夾中,現(xiàn)在可以按以下示例所示將它用作 XMLTransform SQL 函數(shù)的參數(shù)(假設(shè)您以 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 數(shù)據(jù)部分中的 XQuery 查詢相同的輸出。

將列表 4 中的 orderTotal XSLT 樣式表與查詢 XMLType 數(shù)據(jù)部分中的示例使用的 XQuery 表達式進行比較,您可能會注意到,XQuery 方法要比 XSLT 方法更具吸引力。至少在使用 XQuery 時,您只需編寫很少的代碼即可獲得相同的最終結(jié)果。

查詢 RSS 新聞提供

由于 RSS 新聞提供本質(zhì)上是一個托管的 XML 文件(RSS 新聞閱讀器從中獲取頭條新聞或其他內(nèi)容),因此可以像處理任何其他可以通過 Web 獲得的 XML 文檔那樣來處理它。正如您在本文前面的查詢外部數(shù)據(jù)源部分中所見,可以使用 XQuery 查詢?nèi)魏慰梢酝ㄟ^ URL 訪問的 XML。您通過 XMLTable 和 XMLQuery SQL 函數(shù)中的 PASSING 子句動態(tài)綁定所有外部 XML 數(shù)據(jù)源。以下是一個查詢 RSS 新聞提供的 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 應(yīng)生成一個 XML 文檔,其中包含 Oracle 技術(shù)網(wǎng) (OTN) 最近發(fā)布的與 PHP 技術(shù)相關(guān)的頭條新聞列表。所生成的 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





但在開發(fā)實際應(yīng)用程序時,您將很可能需要 XQuery 表達式直接生成 HTML 標記,而不是僅僅生成一個如上所示的 XML 文檔。這樣,您便可以構(gòu)建一個更靈活、可維護性更高的應(yīng)用程序,原因是在這種情況下,所有 RSS 處理(從提取必要的數(shù)據(jù)到將它包裝在 HTML 標記中)都將轉(zhuǎn)移到數(shù)據(jù)庫。這使您不必編寫負責(zé) RSS 處理的應(yīng)用程序代碼。實際上這意味著您不必在諸如 RSS 新聞提供的結(jié)構(gòu)已經(jīng)更改的情況下修改應(yīng)用程序代碼。相反,您只需修改用于 RSS 處理的 XQuery 表達式。

總結(jié)

您已經(jīng)在本文了解到,XQuery 是一個綜合的查詢語言,它提供了一種用于查詢、構(gòu)建和轉(zhuǎn)換 XML 數(shù)據(jù)的高效方法。盡管 Oracle XQuery 實施使您可以操作任何可以用 XML 表示的數(shù)據(jù)(無論它存儲在數(shù)據(jù)庫中、位于網(wǎng)站上還是存儲在文件系統(tǒng)中),但將處理的數(shù)據(jù)移動到數(shù)據(jù)庫中始終是一個不錯的主意。對于數(shù)據(jù)庫中存儲的數(shù)據(jù),Oracle XML DB(對 XPath 重寫使用同一機制)只能顯著優(yōu)化處理那些基于以下數(shù)據(jù)構(gòu)建的 XQuery 表達式:這些數(shù)據(jù)包括關(guān)系數(shù)據(jù)、對象-關(guān)系數(shù)據(jù)或使用結(jié)構(gòu)化(對象-關(guān)系)存儲技術(shù)存儲的基于 XML 模式的 XMLType 數(shù)據(jù)。