本文給出 CALL_PROCEDURE UDF在觸發器與UDF中調用存儲過程的兩個完整可運行測試腳本,驗證跨上下文調用機制的可靠性。
-- 環境準備
CREATE TABLE t1 (col1 INT);
CREATE TABLE t2 (col1 INT);
CREATE PROCEDURE abc(IN p INT) BEGIN INSERT INTO t1 VALUES(p); END;
-- 創建觸發器:插入t2後,調用CALL_PROCEDURE執行abc(new.col1 * 2)
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;
-- 驗證
INSERT INTO t2 VALUES(20);
SELECT * FROM t1; -- 結果: COL1=40 (20*2),觸發器生效
-- 環境準備
CREATE TABLE c (a INT CHECK (a <> 8), a1 INT);
CREATE PROCEDURE abc(IN p INT, IN p2 INT) BEGIN INSERT INTO c VALUES(p, p2); END;
-- 創建UDF:封裝CALL_PROCEDURE調用
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; -- 返回0表示成功
SELECT * FROM c; -- 結果: (10,20) 原有數據 + (30,40) 新插入,UDF調用生效
database_name 參數指定目標庫,打破單庫限制。下文將詳細講解C語言例程(UDF/存儲過程)的預編譯、編譯、鏈接全流程(含 bldrtn 腳本用法),以及在數據庫中註冊例程的完整DDL腳本(functions.db2)。