DB2 V7 的 SQL 預存程序開發依賴 IBM 官方工具 Stored Procedure Builder (SPB),但 SPB 本身不包含編譯器,必須整合第三方 C 編譯器(Visual C++ 5.0/6.0 或 IBM VisualAge C++)。本文以最常見的 VC++ 6.0 為例,詳述從專案建立到編譯選項配置的完整步驟與避坑指南。
C:\Program Files\Microsoft Visual Studio\VC98)DB2INSTANCE、PATH 包含 sqllib\bin)spb 啟動 Stored Procedure Builder在專案屬性中找到 「已選擇」→「SQL SP 建置選項」,重點配置兩大項:
c:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat
說明: 此批次檔設定 VC++ 編譯所需的環境變數(INCLUDE、LIB、PATH 等)。路徑需依實際安裝位置調整,且不支援長檔名,若路徑含空格諈使用 8.3 短檔名格式(如 C:\PROGRA~1\MICROS~1\VC98\Bin\vcvars32.bat)。
cl -Ox -W2 /TC -D_X86_=1 -IC:\Progra~1\SQLLIB\include SQLROUTINE_FILENAME.c
c /link -dll -def:SQLROUTINE_FILENAME.def /out:SQLROUTINE_FILENAME.dll C:\Progra~1\SQLLIB\lib\db2api.lib
關鍵參數解析:
cl:VC++ 編譯器驅動程式-Ox:最大優化;-W2:警告等級 2/TC:強制視為 C 原始檔(SPB 產生的 .c 檔)-D_X86_=1:定義 x86 平台巨集-IC:\Progra~1\SQLLIB\include:DB2 表頭檔路徑(必須用 8.3 短路徑)SQLROUTINE_FILENAME.c:SPB 以巨集替換的原始檔名/link -dll:產生 DLL;-def:模組定義檔;/out:輸出 DLL 檔名C:\Proga~1\SQLLIB\lib\db2api.lib:DB2 API 匯入庫(同樣需短路徑)vcvars32.bat,再執行 cl 編譯、link 連結,最終在專案目錄生成 .dll 與 .bnd 檔| 現象 | 原因 | 對策 |
|---|---|---|
| 編譯失敗:fatal error C1083: Cannot open include file: 'sql.h' | DB2 include 路徑錯誤或未用短路徑 | 檢查 -I 參數指向 sqllib\include,使用 8.3 格式 |
| 連結失敗:LNK2001: unresolved external symbol _sqlexec@... | 未連結 db2api.lib | 確認 /link 行包含正確 db2api.lib 短路徑 |
| SPB 建置無反應/閃退 | vcvars32.bat 路徑錯誤或權限不足 | 以管理員身分執行 SPB;驗證批次檔可獨立執行 |
| 部署後呼叫預存程序報 SQLCODE -4301 | DLL 未部署至伺服器 sqllib\function 目錄 | 手動複製 .dll 至 DB2 伺服器 function 目錄或設定 LIBPATH |
自 DB2 V8 起,SQL 預存程序不再需要 C 編譯器,改由 DB2 內建 SQL 程序引擎直接解析執行,部署極大簡化。若仍在維護 V7 系統,請妥善保存 VC++ 6.0 安裝媒體與 SPB 專案檔;新專案請直接升級至支援版本。
DB2 V7 SPB + VC++ 6.0 建置環境的核心在於:「正確的短路徑、完整的環境變數、正確的編譯連結參數」。掌握上述配置邏輯,即可打通從 SQL 程式碼到可執行 DLL 的完整鏈路。建議將配置參數封裝為專案範本,供團隊複用。