語法方言、管理工具、應用介面差異是遷移三大阻力。DB2 提供存儲過程與用戶定義函數(UDF)彌補缺口,本文提供三個實戰例程(含完整原始碼下載鏈接)。
TRUNCATE TABLE t 瞬間清空表、極少日誌、不觸發觸發器、釋放高水位標記。
利用 IMPORT REPLACE 空檔案(/dev/null 或 NUL),單次日誌記錄清空全表。封裝為存儲過程:
CREATE PROCEDURE TRUNCATE_TABLE (IN schema_name VARCHAR(130), IN table_name VARCHAR(130))
LANGUAGE C EXTERNAL NAME 'truncate!truncate_table'
PARAMETER STYLE SQL DETERMINISTIC NOT FENCED;
內部呼叫 sqluimpr() CAPI,檔案來源 /dev/null,訊息檔同用 /dev/null。支援 NULL schema(取 CURRENT SCHEMA)、雙引號定界名稱、大小寫敏感。
CALL TRUNCATE_TABLE('DB2INST1','TAB1') -- ReturnStatus=0
SELECT * FROM TAB1 -- 0 records
返回客戶端進程所在主機名(非資料庫伺服器主機名)。
UDF 讀取 DBINFO 結構中的應用程式 ID,解碼前 8 位元組 IP(或 *LOCAL),呼叫 C 庫 gethostbyaddr() 反解主機名。DRDA 協議下 IP 首字元 0-9 需映射 G-P 再反映射。
CREATE FUNCTION HOST_NAME() RETURNS VARCHAR(255)
LANGUAGE C EXTERNAL NAME 'host_name!host_name'
PARAMETER STYLE SQL DETERMINISTIC NOT FENCED;
demoaix):返回 demoaix(解析 127.0.0.1)。mycomputer):返回 mycomputer。DB2 觸發器/UDF 原生不支援 CALL 存儲過程(官方承諾未來版本支援)。
建立 UDF CALL_PROCEDURE,內部建立新連接、執行 CALL、返回狀態碼。簽名:
CREATE FUNCTION CALL_PROCEDURE (
procedure_name VARCHAR(257), -- 完整限定名
parameter_list VARCHAR(32000), -- 逗號分隔參數字串
database_name VARCHAR(8),
user_name VARCHAR(128),
password VARCHAR(200)
) RETURNS INTEGER
LANGUAGE C EXTERNAL NAME 'call_proc!call_procedure'
PARAMETER STYLE SQL NOT DETERMINISTIC EXTERNAL ACTION NOT FENCED;
CREATE TRIGGER ins AFTER INSERT ON t2
REFERENCING NEW AS new FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
VALUES(CALL_PROCEDURE('DB2INST1.ABC', CHAR(new.col1*2), 'SAMPLE','DB2INST1','db2inst1'));
END
插入 t2 VALUES(20) → 觸發器觸發 → 過程 ABC 將 40 寫入 t1。
CREATE FUNCTION udf_withcall(parm1 INT, parm2 INT) RETURNS INT
LANGUAGE SQL NOT DETERMINISTIC EXTERNAL ACTION
RETURN CALL_PROCEDURE('DB2INST1.ABC', CHAR(parm1)||','||CHAR(parm2), 'SAMPLE','DB2INST1','db2inst1');
SELECT udf_withcall(30,40) FROM SYSIBM.SYSDUMMY1 → 過程將 (30,40) 寫入表 c。
# UNIX/Linux
cd /sqllib/samples/c
./bldrtn <dbname> <uid> <pwd> # 預編譯、編譯、鏈接、部署至 sqllib/function
# Windows
bldrtn.bat <dbname> <uid> <pwd>
部署後在資料庫註冊 CREATE PROCEDURE/FUNCTION 即可使用。
三大例程精準填補 Oracle/Sybase/SQL Server 遷移至 DB2 的功能鴻溝:TRUNCATE_TABLE 秒清大表、HOST_NAME() 取客戶端主機名、CALL_PROCEDURE 打通觸發器/UDF 調用存儲過程的最後一公里。源碼開箱即用,大幅降低遷移風險與開發成本。