許多開發人員在尋找 DB2 SQL 預存程序的實戰範例時,往往難以找到包含錯誤處理、動態游標、聯合體(Federation)別名操作、分支與迴圈邏輯的完整代碼。本文分享一個從 Oracle 移植到 DB2 的實際生產環境預存程序,涵蓋帳務數據抽取、任務管理、動態別名創建與清理等核心場景,供大家參考探討。
該預存程序 IPD.st_inter_PROF 接收轉檔任務 ID、類型、起始日期及目標表名等參數,透過 OUT 參數返回錯誤碼與訊息。主體區塊 P1 採用結構化錯誤處理:
state、動態 SQL 語句變量 stmt/v_sql_str、游標變量 c_bill_task_id 等。EXIT HANDLER FOR SQLEXCEPTION 捕獲運行時錯誤並記錄 SQLCODE;CONTINUE HANDLER FOR NOT FOUND 處理游標結束條件。ipd.transfer_task 讀取 deal_cycle。ADMINISTRATOR.bill_task_cycle 關聯 billing_cycle,篩選上一個帳期的任務 ID。bill_task_id:
ADMINISTRATOR.ACCT_ITEM_BILLINGDAY_<id> 指向遠端聯合體表 bill.cal.acct_item_billingday_<id>。ipd.sp_exec_dsql 執行動態 DDL/DML。rows_cnt。ipd.bi_settle_tablespace 檢查表空間。ipd.<in_TRANSFER_name>。INSERT ... UNION SELECT 動態 SQL 將多張分區表數據合併插入介面表。deal_flag=2。DROP NICKNAME 移除臨時創建的聯合體別名。ADMINISTRATOR.acct_item 表,建表採用 LIKE 子句,插入指定欄位列表。ipd.bi_check 執行後續驗證。state 記錄當前操作步驟,錯誤訊息精確定位問題環節。sp_exec_dsql 返回 o_err_no,主程序統一判斷流控。COMMIT,確保數據一致性。此範例展示了大型計費系統從 Oracle 遷移至 DB2 時,如何利用 DB2 SQL PL 實現複雜的批次處理邏輯。對於需要跨多個分區表(如按帳期分表)進行數據抽取、匯總、轉檔的場景,該模式極具參考價值。開發者可根據實際表結構調整動態 SQL 構建邏輯,並擴展錯誤碼分類以滿足監控需求。
完整代碼已包含在原文中,建議結合 DB2 官方文檔中 /sqllib/samples 目錄下的範例程式一同研讀,以掌握更多最佳實踐。