本文為 DB2 9.5 SQL Procedure Developer 認證考試 (Exam 735) 第五部分備考指南,重點覆蓋全局聲明式臨時表 (DGTT)、層次化查詢、MERGE 語句、ADMIN_CMD 過程、GET DIAGNOSTICS、保存點與 PureXML 在存儲過程中的應用等核心考點。
DGTT 存儲臨時數據與中間結果,無需日誌、不入系統編目、單連接可見、無鎖開銷,性能優勢顯著。會話結束自動清理。
DECLARE GLOBAL TEMPORARY TABLE temp_proj
(projno CHAR(6), projname VARCHAR(24), projsdate DATE, projedate DATE)
WITH REPLACE
ON COMMIT PRESERVE ROWS
NOT LOGGED
IN usr_tbsp;
SESSION,引用時必須加前綴 SESSION.temp1CREATE USER TEMPORARY TABLESPACE)DECLARE GLOBAL TEMPORARY TABLESESSION. 前綴關係數據庫表達樹狀結構(如物料清單 BOM)需遞歸 SQL。核心機制:WITH RECURSIVE (DB2 用 WITH 隱含遞歸) + UNION ALL。
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
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
)
SELECT assembly_id, sub_assembly_id, assembly_nm FROM assembly;

MERGE 結合條件性 UPDATE/INSERT/DELETE,適用於數據同步場景(如分支機構數據合併到總部)。
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 (...) VALUES (...);
ON 子句定義匹配鍵WHEN MATCHED 處理更新/刪除WHEN NOT MATCHED 處理插入e, m) 消除列引用歧義CALL SYSPROC.ADMIN_CMD(command_string) 允許從應用/過程調用管理命令(不支持 UDF/觸發器)。輸入參數 CLOB(2M)。
CREATE PROCEDURE test_admin_cmd()
P1: BEGIN
DECLARE sql_string VARCHAR(200);
SET sql_string = 'LOAD FROM C:DB9.5_testorg_exp.txt OF DEL
METHOD P (1,2,3,4,5) INSERT INTO DB2ADMIN.ORG1 ...';
CALL SYSPROC.ADMIN_CMD(sql_string);
END P1
三大核心用途:
INTEGER 變量)VARCHAR(70) 變量)GET DIAGNOSTICS var = ROW_COUNT | DB2_RETURN_STATUS | MESSAGE_TEXT
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS EXCEPTION 1 p_err_mess = MESSAGE_TEXT;
SET v_trunc = 2;
END;
SAVEPOINT name ON ROLLBACK RETAIN CURSORS 創建回滾點。支持嵌套,回滾到指定點不影響之前工作,COMMIT 後所有保存點失效。
INSERT INTO T1 VALUES ('A');
SAVEPOINT SP1 ON ROLLBACK RETAIN CURSORS;
INSERT INTO T1 VALUES ('B');
SAVEPOINT SP2 ON ROLLBACK RETAIN CURSORS;
INSERT INTO T1 VALUES ('C');
SAVEPOINT SP3 ON ROLLBACK RETAIN CURSORS;
INSERT INTO T1 VALUES ('D');
ROLLBACK TO SAVEPOINT SP3; -- 刪除 D
ROLLBACK TO SAVEPOINT SP1; -- 刪除 C, B
COMMIT WORK; -- 保存點失效
INSERT INTO T1 VALUES ('E'); -- 最終表含 A, E
DB2 9.5 為混合型數據庫,SQL 過程原生支持 XML 類型參數/變量,可傳入 XMLEXISTS、XMLQUERY、XMLTABLE 表達式。
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
CREATE PROCEDURE PROC_INS_XML1(v_cid INT, v_info XML)
DYNAMIC RESULT SETS 1
P1: BEGIN
INSERT INTO CUSTOMER (CID, INFO) VALUES (v_cid, v_info);
END P1
IBM Data Studio 可直接解析 XML 字符串作為輸入參數(見圖 2)。
