$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)生成以下輸出(注意,瀏覽器中可能不會顯示標(biāo)記):
100
SKING
AD_PRES
XQuery 與 XSLT
盡管 Oracle 在 Oracle XML DB 中提供了一個自帶 XSLT 處理器,但在很多情況下(尤其是在處理大型文檔時),XQuery 對于構(gòu)建 XML 更高效。此外,XQuery 表達(dá)式通常比為同一作業(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 表達(dá)式計算示例數(shù)據(jù)庫模式 OE 的 purchaseorder 表中存儲的訂單的訂單總計,然后為處理的每個訂單生成了一個 OrderTotal XML 元素。實際上,您可以使用 XSLT 執(zhí)行相同操作。為此,您首先需要創(chuàng)建一個應(yīng)用于 PurchaseOrder XML 文檔的 XSLT 樣式表,以生成相應(yīng)的 OrderTotal 元素。對于此示例,可以使用列表 4 中所示的 XSLT 樣式表。
但在開發(fā)實際應(yīng)用程序時,您將很可能需要 XQuery 表達(dá)式直接生成 HTML 標(biāo)記,而不是僅僅生成一個如上所示的 XML 文檔。這樣,您便可以構(gòu)建一個更靈活、可維護性更高的應(yīng)用程序,原因是在這種情況下,所有 RSS 處理(從提取必要的數(shù)據(jù)到將它包裝在 HTML 標(biāo)記中)都將轉(zhuǎn)移到數(shù)據(jù)庫。這使您不必編寫負(fù)責(zé) RSS 處理的應(yīng)用程序代碼。實際上這意味著您不必在諸如 RSS 新聞提供的結(jié)構(gòu)已經(jīng)更改的情況下修改應(yīng)用程序代碼。相反,您只需修改用于 RSS 處理的 XQuery 表達(dá)式。
總結(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 表達(dá)式:這些數(shù)據(jù)包括關(guān)系數(shù)據(jù)、對象-關(guān)系數(shù)據(jù)或使用結(jié)構(gòu)化(對象-關(guān)系)存儲技術(shù)存儲的基于 XML 模式的 XMLType 數(shù)據(jù)。