存儲過程間若存在呼叫關係(外層呼叫內層),編譯部署時必須先建立被呼叫的內層過程,再建立外層過程,否則會報錯「物件不存在」。
DROP PROCEDURE IF EXISTS proc_name(或 DROP PROCEDURE proc_name 捕獲錯誤)確保冪等性。CREATE PROCEDURE 陳述式。deploy_procs.sql-- 1. 內層工具過程
DROP PROCEDURE IF EXISTS inner_util!
CREATE PROCEDURE inner_util(IN p1 INT)
LANGUAGE SQL
BEGIN
-- 邏輯
END!
-- 2. 外層業務過程(呼叫 inner_util)
DROP PROCEDURE IF EXISTS outer_biz!
CREATE PROCEDURE outer_biz(IN p2 INT)
LANGUAGE SQL
BEGIN
CALL inner_util(p2);
END!
db2 connect to MYDB
db2 -td! -f deploy_procs.sql
db2 terminate
-td!:指定語句結束符為 !-f:指定輸入檔案適用於需穿插執行 DDL、DML、授權等混合操作的場景。
deploy.bat@echo off
set DB=MYDB
set USER=db2admin
set PWD=password
db2 connect to %DB% user %USER% using %PWD%
if errorlevel 1 goto ERR
rem 依序執行多個 SQL 檔
db2 -td! -f .\procs\01_inner_util.sql
db2 -td! -f .\procs\02_outer_biz.sql
db2 -td! -f .\procs\03_grant_perms.sql
db2 terminate
echo 部署完成
goto END
:ERR
echo 連線失敗,請檢查資料庫/帳號
:END
pause
若需備份或遷移現有過程,可用以下查詢生成 CREATE PROCEDURE 腳本:
EXPORT TO procedures.del OF DEL MODIFIED BY LOBSINFILE
SELECT
'SET CURRENT SCHEMA = ' || RTRIM(PROCSCHEMA) || ';' || CHR(10) ||
'SET CURRENT PATH = SYSIBM,SYSFUN,SYSPROC,' || RTRIM(PROCSCHEMA) || ';' || CHR(10) ||
TEXT || ';' || CHR(10)
FROM SYSCAT.PROCEDURES
WHERE PROCNAME LIKE 'NP_%'
ORDER BY CREATE_TIME;
TEXT 欄位包含完整 CREATE PROCEDURE 定義(含結束符)。pre_deploy_check.sql 驗證前置條件(Schema 存在、權限、相依物件)。DROP PROCEDURE 列表)以備緊急回退。