在 XMLQuery/XMLTable 中使用 PASSING 子句綁定動態變數,而非字符串拼接,帶來三大收益:
{$i/EMPLOYEE_ID, $i/EMAIL, $i/JOB_ID}
100
SKING
AD_PRES
*/
?>
關鍵點:PASSING XMLElement("empno", :empno) AS "empno" 將 PHP 變數封裝為 XML 片段傳入 XQuery,XQuery 中以 $empno 直接引用。
for $po in /PurchaseOrder
return
{$po/Reference}
{sum($po/LineItems/LineItem/Part/@Quantity * $po/LineItems/LineItem/Part/@UnitPrice)}
-- 將 XSLT 存入 Oracle XML DB Repository: /public/orderTotal.xsl
SELECT XMLTransform(OBJECT_VALUE,
xdbUriType('/public/orderTotal.xsl').getXML()).GetStringVal() AS RESULT
FROM purchaseorder
WHERE existsNode(OBJECT_VALUE, '/PurchaseOrder[User="EABEL"]') = 1;
| 維度 | XQuery | XSLT |
|---|---|---|
| 代碼量 | 極少 (單表達式) | 大 (模板+遞歸) |
| 可讀性 | 高 (類 SQL) | 中 (模板匹配思維) |
| 性能 (大文檔) | 優 (流式處理、索引重寫) | 劣 (樹模型全載入) |
| 適用場景 | 結構化 XML、關係數據構建 XML | 文檔轉換、混合內容、既有 XSLT 資產 |
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('https://www.oracle.com/technology/syndication/rss_otn_news.xml').getCLOB()) AS "h"
RETURNING CONTENT).GetStringVal() AS RESULT
FROM DUAL;
Tue, 01 Nov 2005 19:37:42 GMT
- https://www.oracle.com/technology/xe
- https://www.oracle.com/technology/pub/articles/oracle_php_cookbook
- https://www.oracle.com/technology/tech/php/zendcore/index.html
SELECT XMLQuery(
'for $i in $h//channel
return
OTN Latest: {$i/lastBuildDate}
{for $j in $h//item
where ora:contains($j, "PHP")
return - {$j/title}
}
'
PASSING XMLParse(DOCUMENT HTTPURIType('https://www.oracle.com/technology/syndication/rss_otn_news.xml').getCLOB()) AS "h"
RETURNING CONTENT).GetClobVal() AS HTML_FRAGMENT
FROM DUAL;
優勢:RSS 結構變更時,**只需修改數據庫端 XQuery**,前端應用代碼完全不用動,實現關注點分離。