$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 樣式表。
但在開發實際應用程序時,您將很可能需要 XQuery 表達式直接生成 HTML 標記,而不是僅僅生成一個如上所示的 XML 文檔。這樣,您便可以構建一個更靈活、可維護性更高的應用程序,原因是在這種情況下,所有 RSS 處理(從提取必要的數據到將它包裝在 HTML 標記中)都將轉移到數據庫。這使您不必編寫負責 RSS 處理的應用程序代碼。實際上這意味著您不必在諸如 RSS 新聞提供的結構已經更改的情況下修改應用程序代碼。相反,您只需修改用于 RSS 處理的 XQuery 表達式。
總結
您已經在本文了解到,XQuery 是一個綜合的查詢語言,它提供了一種用于查詢、構建和轉換 XML 數據的高效方法。盡管 Oracle XQuery 實施使您可以操作任何可以用 XML 表示的數據(無論它存儲在數據庫中、位于網站上還是存儲在文件系統中),但將處理的數據移動到數據庫中始終是一個不錯的主意。對于數據庫中存儲的數據,Oracle XML DB(對 XPath 重寫使用同一機制)只能顯著優化處理那些基于以下數據構建的 XQuery 表達式:這些數據包括關系數據、對象-關系數據或使用結構化(對象-關系)存儲技術存儲的基于 XML 模式的 XMLType 數據。