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

在 DB2 SQL 預存程序中運用 XML:pureXML 完整實戰指南

     編輯:DB2 教學

前言

DB2 9 引入 pureXML 技術,支援 XML 原生階層式儲存、索引、XQuery/SQL/XML 查詢。本文詳細說明 SQL 預存程序中使用 XML 型別參數、變數、SQL/XML 函數(XMLQUERY、XMLEXISTS、XMLTABLE)、動態游標執行 XQuery、COMMIT/ROLLBACK 後 XML 變數失效的限制與替代方案,並提供豐富程式碼範例。

XML 處理四種方式

  1. 一般 SQL:僅將 XML 文件視為整體實體插入/擷取/轉換,無法解析片段。
  2. SQL/XML + 嵌入 XQuery:XMLQUERY 擷取、XMLEXISTS 謂詞、XMLTABLE 關聯化。
  3. 原生 XQuery:db2-fn:xmlcolumn 存取 XML 欄;db2-fn:sqlquery 執行 SELECT 回傳 XML。
  4. XQuery + 嵌入 SQL:在 XQuery 中呼叫 SQL 查詢。

預存程序新增 XML 功能

  • 參數、變數可宣告為 XML 型別(無需指定長度)。
  • XMLQUERY/XMLEXISTS/XMLTABLE 可用於游標、SELECT INTO、VALUES INTO、SET 賦值。
  • XML 欄可回傳於游標結果集、綁定於 SELECT/UDI 語句。
  • IF/THEN/ELSE 可測試 XMLEXISTS 謂詞。
  • XML 變數可從 SELECT INTO、VALUES INTO、FETCH INTO、EXECUTE INTO、SET 載入。

關鍵限制與解決方案

限制影響替代方案
XQuery 僅能在動態游標執行靜態 SQL 區塊不可直接寫 XQuery改用動態游標 PREPARE/OPEN/FETCH
COMMIT/ROLLBACK 後 XML 變數失效後續引用拋出 SQLSTATE 560CE1) 寫入持久表(DGTT 不支援 XML 欄)
2) 序列化為 VARCHAR 後再解析

程式碼範例精選

1. 參數與變數宣告

CREATE PROCEDURE process_cust (
  IN inpdoc XML,
  OUT outdoc XML,
  INOUT doc3 XML
) LANGUAGE SQL NO EXTERNAL ACTION
BEGIN
  DECLARE v_xml XML;
  -- 業務邏輯
END

2. 變數賦值三種寫法(同輸入同輸出)

輸入 XML:<customer><name>Jed Clampett</name><city>Beverly Hills</city></customer>

  • SET:SET p2 = XMLCAST(XMLQUERY('$d/customer/name' PASSING inpdoc AS "d") AS VARCHAR(30));
  • SELECT INTO:SELECT XMLQUERY(...) INTO p3 FROM sysibm.sysdummy1;
  • VALUES INTO:VALUES XMLQUERY(...) INTO p3;

輸出:p2 = 'Jed Clampett'(純文字),p3 = '<name>Jed Clampett</name>'(XML 片段)。

3. XMLCAST 型別轉換錯誤處理

DECLARE CONTINUE HANDLER FOR SQLSTATE '10608' SET v_badnum = 'Y';
SET v_int = XMLCAST(XMLQUERY('$d/customer/custid' PASSING inpdoc AS "d") AS INT);
IF v_badnum = 'Y' THEN SIGNAL SQLSTATE '75002' SET MESSAGE_TEXT = 'Bad number'; END IF;

4. IF/THEN/ELSE 搭配 XMLEXISTS

IF XMLEXISTS('$d/request[@action="add"]' PASSING inpdoc AS "d") THEN
  SIGNAL SQLSTATE '75002' SET MESSAGE_TEXT = 'F(x) add';
ELSEIF XMLEXISTS('$d/request[@action="update"]' PASSING inpdoc AS "d") THEN
  SIGNAL SQLSTATE '75002' SET MESSAGE_TEXT = 'F(x) update';
ELSE
  SIGNAL SQLSTATE '75002' SET MESSAGE_TEXT = 'F(x) invalid';
END IF;

5. PASSING 子句多變數與位置存取

  • 傳遞 VARCHAR 變數作屬性比對:XMLQUERY('$d/customers/customer[@id=$a]/name' PASSING inpdoc AS "d", search AS "a")
  • 依位置存取屬性/節點:@*[$a]、*[$n] 搭配整數參數 attrpos/nodepos。

測試資料產生技巧

CALL ex_proc(XMLPARSE(DOCUMENT '<customer><custid>HX25</custid></customer>'));
-- 或保留換行以利閱讀
CALL ex_proc(XMLPARSE(DOCUMENT 'HX25'));

結語

掌握 SQL/XML 函數、動態游標 XQuery、XML 變數生命週期管理與錯誤處理,即能在預存程序中高效處理 pureXML 資料,將 XML 商務邏輯封裝於資料庫層,提升效能與維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved