首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle XQuery 實戰 (四):動態變數綁定、XSLT 對比與 RSS 應用開發

     編輯:Oracle 資料庫基礎

一、動態變數綁定:消除硬編碼、提升性能與安全

在 XMLQuery/XMLTable 中使用 PASSING 子句綁定動態變數,而非字符串拼接,帶來三大收益:

  1. 計劃重用:SQL 文本固定,游標共享,減少硬解析
  2. 注入防護:參數化傳遞,杜絕 XQuery 注入
  3. 類型安全:隱式/顯式類型轉換由內核處理

二、PHP + OCI8 綁定變數實戰

{$i/EMPLOYEE_ID, $i/EMAIL, $i/JOB_ID}
  100
  SKING
  AD_PRES

*/
?>

關鍵點:PASSING XMLElement("empno", :empno) AS "empno" 將 PHP 變數封裝為 XML 片段傳入 XQuery,XQuery 中以 $empno 直接引用。

三、XQuery vs XSLT:同樣任務的兩種風格

場景:計算採訂單總額 (Quantity × UnitPrice)

1. XQuery 方案 (簡潔、聲明式)

for $po in /PurchaseOrder
return 
  {$po/Reference}
  {sum($po/LineItems/LineItem/Part/@Quantity * $po/LineItems/LineItem/Part/@UnitPrice)}

2. XSLT 方案 (冗長、命令式遞歸)





  
    
    
    
      
        
        
      
    
    
      
      
    
  



  
  
    
    
      
      
        
        
      
    
  

3. 數據庫中調用 XSLT

-- 將 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;

4. 核心差異總結

維度XQueryXSLT
代碼量極少 (單表達式)大 (模板+遞歸)
可讀性高 (類 SQL)中 (模板匹配思維)
性能 (大文檔)優 (流式處理、索引重寫)劣 (樹模型全載入)
適用場景結構化 XML、關係數據構建 XML文檔轉換、混合內容、既有 XSLT 資產

四、查詢 RSS 訂閱源:從 XML 到 HTML 的端到端應用

1. 基礎 XQuery 抓取 OTN RSS (含 PHP 關鍵字過濾)

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;

2. 生成 XML 輸出範例


  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
  

3. 進階:直接生成 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**,前端應用代碼完全不用動,實現關注點分離。

五、總結:XQuery 核心價值

  • 統一查詢語言:關係數據、XMLType、外部 HTTP/文件系統 XML、Repository 資源
  • 推下計算:邏輯下推至數據庫內核,利用 XPath Rewrite、XMLIndex、結構化存儲優化
  • 構建與轉換一體:FLWOR 表達式同時完成查詢、過濾、聚合、XML/HTML/JSON 構建
  • 最佳實踐:將外部/半結構化數據 **載入資料庫** (XMLType 結構化存儲或關係表 + ora:view) 以獲得極致性能
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved