|
將動(dòng)態(tài)變量綁定到 XQuery 表達(dá)式 另一種可以顯著提高 XQuery 表達(dá)式執(zhí)行性能的技術(shù)是使用綁定動(dòng)態(tài)變量。使用綁定變量(而不是將變量串聯(lián)為字符串)可以使 Oracle 重用 SQL 語句,從而減少分析開銷并顯著提高應(yīng)用程序的性能。可以在 XMLQuery 和 XMLTable SQL 函數(shù)中使用 PASSING 子句將動(dòng)態(tài)變量綁定到 XQuery 表達(dá)式。該技術(shù)使您可以根據(jù)客戶端代碼中計(jì)算的參數(shù)動(dòng)態(tài)生成 XML。列表 3 中的示例演示了如何在從 PHP 腳本執(zhí)行的 XQuery 查詢中使用綁定變量。 列表 3:使用綁定變量 XQuery 與 XSLT 盡管 Oracle 在 Oracle XML DB 中提供了一個(gè)自帶 XSLT 處理器,但在很多情況下(尤其是在處理大型文檔時(shí)),XQuery 對(duì)于構(gòu)建 XML 更高效。此外,XQuery 表達(dá)式通常比為同一作業(yè)設(shè)計(jì)的 XSLT 樣式表更具可讀性,并且更清楚。與 XSLT 一樣,XQuery 不但可用于將一個(gè) XML 文檔轉(zhuǎn)換為另一個(gè) XML 文檔,而且還可用于將 XML 轉(zhuǎn)換為另一種基于文本的格式,如 HTML 或 WML。 在本文前面的查詢 XMLType 數(shù)據(jù)部分中,您看到了一個(gè)有關(guān)使用 XQuery 將一個(gè) XML 文檔轉(zhuǎn)換為另一個(gè) XML 文檔的示例。具體而言,該示例使用 XQuery 表達(dá)式計(jì)算示例數(shù)據(jù)庫模式 OE 的 purchaseorder 表中存儲(chǔ)的訂單的訂單總計(jì),然后為處理的每個(gè)訂單生成了一個(gè) OrderTotal XML 元素。實(shí)際上,您可以使用 XSLT 執(zhí)行相同操作。為此,您首先需要?jiǎng)?chuàng)建一個(gè)應(yīng)用于 PurchaseOrder XML 文檔的 XSLT 樣式表,以生成相應(yīng)的 OrderTotal 元素。對(duì)于此示例,可以使用列表 4 中所示的 XSLT 樣式表。 列表 4:使用 XSLT 計(jì)算小計(jì)總和 (Quantity * UnitPrice) 為方便起見,您可能需要將此 XSL 樣式表保存在數(shù)據(jù)庫中,然后再開始使用它。例如,您可以將樣式表作為文件資源保存在 Oracle XML DB 信息庫中。執(zhí)行該操作的方法之一是將樣式表作為文件保存到本地文件系統(tǒng)中,然后使用以下某個(gè)互聯(lián)網(wǎng)協(xié)議將它移動(dòng)到 XML 信息庫:FTP、HTTP 或 WebDAV。假設(shè)您已經(jīng)將列表 4 中的 XSLT 樣式表作為 orderTotal.xsl 保存在 /public 信息庫文件夾中,現(xiàn)在可以按以下示例所示將它用作 XMLTransform SQL 函數(shù)的參數(shù)(假設(shè)您以 OE/OE 的身份登錄): 以上查詢將處理用戶 EABEL 請求的所有訂單(即存儲(chǔ)在 XMLType 的默認(rèn) PurchaseOrder 表中的訂單)并將生成與查詢 XMLType 數(shù)據(jù)部分中的 XQuery 查詢相同的輸出。 將列表 4 中的 orderTotal XSLT 樣式表與查詢 XMLType 數(shù)據(jù)部分中的示例使用的 XQuery 表達(dá)式進(jìn)行比較,您可能會(huì)注意到,XQuery 方法要比 XSLT 方法更具吸引力。至少在使用 XQuery 時(shí),您只需編寫很少的代碼即可獲得相同的最終結(jié)果。 查詢 RSS 新聞提供 由于 RSS 新聞提供本質(zhì)上是一個(gè)托管的 XML 文件(RSS 新聞閱讀器從中獲取頭條新聞或其他內(nèi)容),因此可以像處理任何其他可以通過 Web 獲得的 XML 文檔那樣來處理它。正如您在本文前面的查詢外部數(shù)據(jù)源部分中所見,可以使用 XQuery 查詢?nèi)魏慰梢酝ㄟ^ URL 訪問的 XML。您通過 XMLTable 和 XMLQuery SQL 函數(shù)中的 PASSING 子句動(dòng)態(tài)綁定所有外部 XML 數(shù)據(jù)源。以下是一個(gè)查詢 RSS 新聞提供的 XQuery 示例: 該 XQuery 應(yīng)生成一個(gè) XML 文檔,其中包含 Oracle 技術(shù)網(wǎng) (OTN) 最近發(fā)布的與 PHP 技術(shù)相關(guān)的頭條新聞列表。所生成的 XML 文檔可能如下所示: 但在開發(fā)實(shí)際應(yīng)用程序時(shí),您將很可能需要 XQuery 表達(dá)式直接生成 HTML 標(biāo)記,而不是僅僅生成一個(gè)如上所示的 XML 文檔。這樣,您便可以構(gòu)建一個(gè)更靈活、可維護(hù)性更高的應(yīng)用程序,原因是在這種情況下,所有 RSS 處理(從提取必要的數(shù)據(jù)到將它包裝在 HTML 標(biāo)記中)都將轉(zhuǎn)移到數(shù)據(jù)庫。這使您不必編寫負(fù)責(zé) RSS 處理的應(yīng)用程序代碼。實(shí)際上這意味著您不必在諸如 RSS 新聞提供的結(jié)構(gòu)已經(jīng)更改的情況下修改應(yīng)用程序代碼。相反,您只需修改用于 RSS 處理的 XQuery 表達(dá)式。 總結(jié) 您已經(jīng)在本文了解到,XQuery 是一個(gè)綜合的查詢語言,它提供了一種用于查詢、構(gòu)建和轉(zhuǎn)換 XML 數(shù)據(jù)的高效方法。盡管 Oracle XQuery 實(shí)施使您可以操作任何可以用 XML 表示的數(shù)據(jù)(無論它存儲(chǔ)在數(shù)據(jù)庫中、位于網(wǎng)站上還是存儲(chǔ)在文件系統(tǒng)中),但將處理的數(shù)據(jù)移動(dòng)到數(shù)據(jù)庫中始終是一個(gè)不錯(cuò)的主意。對(duì)于數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù),Oracle XML DB(對(duì) XPath 重寫使用同一機(jī)制)只能顯著優(yōu)化處理那些基于以下數(shù)據(jù)構(gòu)建的 XQuery 表達(dá)式:這些數(shù)據(jù)包括關(guān)系數(shù)據(jù)、對(duì)象-關(guān)系數(shù)據(jù)或使用結(jié)構(gòu)化(對(duì)象-關(guān)系)存儲(chǔ)技術(shù)存儲(chǔ)的基于 XML 模式的 XMLType 數(shù)據(jù)。 |
溫馨提示:喜歡本站的話,請收藏一下本站!