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

DB2 9.5 SQL Procedure Developer (735) 認證攻略第 5 部分:DGTT、遞迴查詢、MERGE、ADMIN_CMD、GET DIAGNOSTICS、Savepoint、PureXML

     編輯:DB2 教學

1. 宣告式全域暫存表 (DGTT)

特性

  • 無日誌、不在系統目錄、單一連線可見、連線結束自動刪除、無鎖開銷。
  • Schema 固定為 SESSION。

建立步驟

  1. 確保存在使用者暫存表空間:
    CREATE USER TEMPORARY TABLESPACE usr_tbsp MANAGED BY SYSTEM USING ('c:\temp\usertempspace');
  2. 宣告 DGTT:
    DECLARE GLOBAL TEMPORARY TABLE temp_proj (projno CHAR(6), projname VARCHAR(24), ...)
    WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED IN usr_tbsp;
  3. 使用時冠上 SESSION.:
    INSERT INTO SESSION.temp_proj ...

關鍵選項

限制: 不支援 BLOB/CLOB/DBCLOB/LONG VARCHAR/LONG VARGRAPHIC/XML/REF/結構化型別。

2. 階層式遞迴查詢 (Recursive CTE)

語法架構

WITH assembly (sub_assembly_id, assembly_nm, assembly_id) AS (
   SELECT sub_assembly_id, assembly_nm, assembly_id
   FROM bill_of_materials
   WHERE assembly_id = 1000          -- Anchor member (執行一次)
   UNION ALL
   SELECT child.sub_assembly_id, child.assembly_nm, child.assembly_id
   FROM bill_of_materials child, assembly p
   WHERE child.assembly_id = p.sub_assembly_id  -- Recursive member (遞迴直到無匹配)
)
SELECT * FROM assembly;

關鍵點

  • UNION ALL 上半部為種子集,下半部自我引用遞迴。
  • 適用於 BOM、組織架構、單據分攤等樹狀結構。

3. MERGE 陳述式 - 單指令完成 UPSERT

MERGE INTO employee AS e
USING (SELECT empno, firstnme, ..., salary FROM my_emp) AS m
ON e.empno = m.empno
WHEN MATCHED THEN UPDATE SET salary = m.salary
WHEN NOT MATCHED THEN INSERT (empno, firstnme, ..., salary)
     VALUES (m.empno, m.firstnme, ..., m.salary);
  • 目標表可為可更新視圖。
  • 關聯名 (e, m) 消除欄位歧義。
  • 一次掃描源表即可完成條件更新/插入/刪除。

4. 系統預存程序 ADMIN_CMD

  • 呼叫語法:CALL SYSPROC.ADMIN_CMD('command_string');
  • 輸入參數:CLOB(2M) 包含管理命令。
  • 支援命令:DESCRIBE, EXPORT, FORCE APPLICATION, IMPORT, LOAD, REORG, RUNSTATS, UPDATE DATABASE CONFIGURATION 等。
  • 限制: 不可在 UDF 或 Trigger 中呼叫。

範例:從檔案載入資料

CREATE PROCEDURE test_admin_cmd()
P1: BEGIN
  DECLARE sql_string VARCHAR(200);
  SET sql_string = 'LOAD FROM C:\DB9.5_test\org_exp.txt OF DEL
     METHOD P (1,2,3,4,5) INSERT INTO DB2ADMIN.ORG1
     (DEPTNUMB, DEPTNAME, MANAGER, DIVISION, LOCATION)
     COPY NO INDEXING MODE AUTOSELECT';
  CALL SYSPROC.ADMIN_CMD(sql_string);
END P1

5. GET DIAGNOSTICS - 捕捉前一條 SQL 狀態

選項行為
ON COMMIT DELETE ROWSCommit 時清空資料 (預設,若無 WITH HOLD 游標)
ON COMMIT PRESERVE ROWSCommit 保留資料
ON ROLLBACK DELETE ROWSRollback 時清空 (預設)
ON ROLLBACK PRESERVE ROWSRollback 保留資料
NOT LOGGED不記錄重做/回溯日誌,效能最佳
WITH REPLACE同名 DGTT 存在時覆蓋

範例 1:取得更新列數

CREATE PROCEDURE UPDATE_RCOUNT(IN sales_corr INT, IN qtr INT, OUT row_updated INT)
P1: BEGIN
  UPDATE SALESBYQUARTER SET sales = sales + sales_corr WHERE y < YEAR(CURRENT DATE) AND q = qtr;
  GET DIAGNOSTICS row_updated = ROW_COUNT;
END P1

範例 2:例外處理中取得訊息

CREATE PROCEDURE mess_text1(IN num INT, IN new_status VARCHAR(10), OUT p_err_mess VARCHAR(70))
P1: BEGIN
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  BEGIN
    GET DIAGNOSTICS EXCEPTION 1 p_err_mess = MESSAGE_TEXT;
  END;
  INSERT INTO tab1 VALUES (num, new_status);
END P1

6. Savepoint - 事務內的子事務檢查點

SAVEPOINT sp1 ON ROLLBACK RETAIN CURSORS;
-- ... DML ...
ROLLBACK TO SAVEPOINT sp1;  -- 僅回滾到 sp1 之後的變更
COMMIT;                     -- 釋放所有 savepoint

巢狀範例

INSERT 'A'; SAVEPOINT sp1;
INSERT 'B'; SAVEPOINT sp2;
INSERT 'C'; SAVEPOINT sp3;
INSERT 'D';
ROLLBACK TO sp3;  -- 移除 D
ROLLBACK TO sp1;  -- 移除 C, B
COMMIT;           -- 只剩 A
INSERT 'E';       -- 最終 A, E

7. PureXML 在 SQL Procedure 中的應用

  • 支援 XML 型別參數與變數。
  • 可傳遞給 XMLEXISTS、XMLQUERY、XMLTABLE 的 XQuery 運算式。

範例 1:回傳 XML 屬性結果集

CREATE PROCEDURE proc_wXML()
DYNAMIC RESULT SETS 1
P1: BEGIN
  DECLARE cursor1 CURSOR WITH RETURN FOR
    SELECT cid,
           XMLQUERY('declare default element namespace "https://posample.org";
                     $cu/customerinfo/name/text()' PASSING d.info AS "cu")
    FROM customer d;
  OPEN cursor1;
END P1

範例 2:接受 XML 參數插入資料

CREATE PROCEDURE PROC_INS_XML1(IN v_cid INT, IN v_info XML)
P1: BEGIN
  INSERT INTO CUSTOMER (CID, INFO) VALUES (v_cid, v_info);
END P1

Data Studio 可直接解析 XML 字串作為輸入參數測試。

考試重點提示

  1. DGTT 必須在 User Temporary Tablespace 建立,Schema 為 SESSION。
  2. Recursive CTE: Anchor + UNION ALL + Recursive member,防止無限遞迴需確保終止條件。
  3. MERGE 適用於資料同步、ETL UPSERT 場景。
  4. ADMIN_CMD 讓 SQL Procedure 具備 DBA 命令能力,但不可用於 UDF/Trigger。
  5. GET DIAGNOSTICS 不改變 SQLCODE/SQLSTATE,變數型別務必對應。
  6. Savepoint 僅在當前事務有效,COMMIT/ROLLBACK 釋放。
  7. PureXML 讓關聯與階層資料在同一 Procedure 中無縫處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
選項回傳值變數型別
ROW_COUNT影響列數 (INSERT/UPDATE/DELETE)INTEGER
DB2_RETURN_STATUSCALL 預存程序傳回碼 (0=成功)INTEGER
MESSAGE_TEXT錯誤/警告訊息文字VARCHAR(70)
DB2_TOKEN_STRING訊息參數代碼VARCHAR(70)