程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle XQuery查詢、構建和轉換XML(4)

Oracle XQuery查詢、構建和轉換XML(4)

編輯:Oracle數據庫基礎
將動態變量綁定到 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 中提供了一個自帶 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)





























































為方便起見,您可能需要將此 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 時,您只需編寫很少的代碼即可獲得相同的最終結果。

查詢 RSS 新聞提供

由於 RSS 新聞提供本質上是一個托管的 XML 文件(RSS 新聞閱讀器從中獲取頭條新聞或其他內容),因此可以像處理任何其他可以通過 Web 獲得的 XML 文檔那樣來處理它。正如您在本文前面的查詢外部數據源部分中所見,可以使用 XQuery 查詢任何可以通過 URL 訪問的 XML。您通過 XMLTable 和 XMLQuery SQL 函數中的 PASSING 子句動態綁定所有外部 XML 數據源。以下是一個查詢 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 應生成一個 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 文檔。這樣,您便可以構建一個更靈活、可維護性更高的應用程序,原因是在這種情況下,所有 RSS 處理(從提取必要的數據到將它包裝在 Html 標記中)都將轉移到數據庫。這使您不必編寫負責 RSS 處理的應用程序代碼。實際上這意味著您不必在諸如 RSS 新聞提供的結構已經更改的情況下修改應用程序代碼。相反,您只需修改用於 RSS 處理的 XQuery 表達式。

總結

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved