使用 Kettle (Pentaho Data Integration) 創建 MySQL 儲存過程完整教程

最近在用 Kettle(PDI / Pentaho Data Integration)部署 MySQL 儲存過程時,都卡在同一個坑:「DELIMITER 報錯」。我把整個解決過程整理成這篇通用教程,完全不涉及任何專案細節,只用一個簡單、通用的範例示範。

不管你是初學者還是老手,看完這篇就能直接複製貼上,在 Kettle 裡建立任意儲存過程!

一、為什麼 Kettle 需要特別處理儲存過程?

Kettle 本身沒有圖形化「設計儲存過程」的工具(因為那是純 SQL DDL 操作)。
正確做法只有一個:用「執行 SQL 腳本」步驟CREATE PROCEDURE 語句送進資料庫。

但 MySQL 儲存過程內部充滿分號 ;,如果直接用命令列工具的寫法,就會在 Kettle 裡直接爆炸。

二、DELIMITER 到底是什麼?為什麼 Kettle 要刪掉它?

DELIMITER 是 MySQL 命令列工具(mysql、Workbench)專用的「客戶端指令」,不是真正的 SQL:

  • 預設結束符是 ;
  • 儲存過程裡又有無數 ;,所以要先改成 $$,寫完再改回 ;

但 Kettle 的「執行 SQL 腳本」走的是 JDBC 連線,JDBC 根本不認識 DELIMITER
直接貼帶 DELIMITER $$ 的腳本,會報錯:

You have an error in your SQL syntax ... near 'DELIMITER'

解決之道超簡單

  • 完全移除 DELIMITER $$DELIMITER ;
  • 只保留最後的 END;
  • 在 Kettle 步驟裡勾選 「作為單一語句執行」

三、給 Kettle 專用的「通用修正版」範例腳本(直接複製)

以下是一個通用新增記錄並返回 ID 的儲存過程(可直接替換成你的業務邏輯):

-- =====================================================
-- Kettle 建立通用儲存過程範例
-- =====================================================
DROP PROCEDURE IF EXISTS `sp_insert_record`;

CREATE PROCEDURE `sp_insert_record`(
    IN p_name VARCHAR(100),           -- 姓名
    IN p_dept VARCHAR(50),            -- 部門
    IN p_salary DECIMAL(15,2),        -- 薪資
    OUT o_record_id BIGINT,           -- 返回新記錄ID
    OUT o_result_code INT,            -- 0=成功 / -1=失敗
    OUT o_result_msg VARCHAR(200)
)
BEGIN
    DECLARE v_record_id BIGINT;
    DECLARE v_current_time DATETIME;
    
    -- 錯誤處理
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SET o_result_code = -1;
        SET o_result_msg = '數據插入失敗,事務已回滾';
    END;

    START TRANSACTION;
    SET v_current_time = NOW();

    -- 插入主表
    INSERT INTO your_table_name (
        name, dept, salary, 
        create_time, update_time
    ) VALUES (
        p_name, p_dept, p_salary, 
        v_current_time, v_current_time
    );

    SET v_record_id = LAST_INSERT_ID();

    COMMIT;

    -- 返回結果
    SET o_record_id = v_record_id;
    SET o_result_code = 0;
    SET o_result_msg = '記錄創建成功';
END;

(你只要把 your_table_name 和欄位改成自己的表就好,邏輯完全可擴展成複雜事務、序列號、審批流程等。)

四、在 Kettle 裡執行的 7 步驟(超簡單)

  1. 開啟 Spoon → 新建轉換(或作業)
  2. 左側「核心物件」→ 「腳本」類別 → 拖入 執行 SQL 腳本
  3. 雙擊步驟 → 選擇你的 MySQL 資料庫連線(記得先測試連線成功)
  4. 把上面修正版腳本整段貼到「要執行的 SQL 腳本」框
  5. 關鍵設定(一定要這樣勾):
    • 作為單一語句執行(最重要!)
    • 每列執行?(取消勾選)
  6. 按 F9 執行
  7. 成功後,去資料庫執行 SHOW CREATE PROCEDURE sp_insert_record; 確認已建立

小提醒:資料庫帳號必須擁有 CREATE ROUTINE 權限。

五、建立完成後,怎麼在 Kettle 呼叫它?

請改用專用步驟 「呼叫 DB 儲存過程」(Call DB Procedure):

  • 設定 IN 參數
  • 接收 OUT 參數(o_record_id、o_result_code、o_result_msg)
  • 可以接後續步驟做判斷或寫入檔案

超方便,完全不用再寫 Execute SQL!

六、總結與進階小技巧

  • Kettle + MySQL 儲存過程的核心訣竅就是:「去掉 DELIMITER + 勾選單一語句
  • 這套方法同樣適用於 CREATE FUNCTION、TRIGGER、VIEW 等所有 DDL 操作
  • 如果你的過程很複雜(多個 INSERT、迴圈、動態 SQL),一樣用這方法

這篇文章把我 debug 的所有經驗濃縮成最實戰版本,希望對正在用 Kettle 做企業系統的你有幫助!

posted @ 2026-03-16 17:13  zerOneAlchemist  阅读(4)  评论(0)    收藏  举报