TRUNCATE TABLE、HOST_NAME());利用 DB2 sqluimpr() API 封裝 IMPORT ... REPLACE INTO 實現 TRUNCATE_TABLE;解析 DBINFO 結構體中的應用 ID 提取客戶端 IP 反解主機名實現 HOST_NAME();通過 UDF 調用存儲過程繞過「觸發器/函數中不能 CALL 過程」限制。
sqluimpr() 以 /dev/null (Windows NUL) 為空數據源執行 IMPORT ... REPLACE INTO,單次日誌記錄清空全表。schema 可為 NULL(取 CURRENT SCHEMA),支持雙引號定界標識符。CREATE PROCEDURE TRUNCATE_TABLE ... LANGUAGE C EXTERNAL NAME 'functions!truncate_table' FENCED THREADSAFEDBINFO 取應用 ID 前 8 字節解碼 IP(本地連接為 127.0.0.1),調用 gethostbyaddr() 反解。DRDA 協議下 IP 首字節 0-9 需映射回 G-P 再反解。CREATE FUNCTION HOST_NAME() RETURNS VARCHAR(128) ... LANGUAGE C EXTERNAL NAME 'functions!host_name' DBINFO NOT FENCEDCALL proc(params) 執行,返回 CLP 返回碼(0 成功)。CREATE FUNCTION CALL_PROCEDURE ... RETURNS INTEGER ... LANGUAGE C EXTERNAL NAME 'functions!call_procedure' THREADSAFE EXTERNAL ACTIONsqllib/samples/c/functions.sqc;bldrtn functions(Windows 需編輯 bldrtn.bat 鏈接 ws2_32.lib);sqllib/function;functions.db2 腳本註冊對象(終止符 @):db2 -td@ -vf functions.db2。
-- TRUNCATE_TABLE
CALL TRUNCATE_TABLE('DB2INST1', 'TAB1'); -- 表瞬間清空
-- HOST_NAME
VALUES HOST_NAME(); -- 返回 'demoaix' 或 'mycomputer'
-- CALL_PROCEDURE 在觸發器中
CREATE TRIGGER INS AFTER INSERT ON T2
REFERENCING NEW AS N FOR EACH ROW
BEGIN ATOMIC
VALUES CALL_PROCEDURE('DB2INST1.ABC', CHAR(N.COL1*2), 'SAMPLE', 'DB2INST1', 'db2inst1');
END;
gcc)。CALL_PROCEDURE 每次調用建立新連接,高頻場景需評估連接開銷。