首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 儲存過程入門:從建立到 Java 呼叫的完整實戰範例

     編輯:MySQL 綜合教學

為什麼使用儲存過程?

  • 效能提升:預編譯,減少網路傳輸(只傳呼叫命令)
  • 維護性強:業務邏輯集中在資料庫端,不散落在應用程式碼中
  • 安全性高:可控制存取權限,防止 SQL 注入

建立簡單加法儲存過程


mysql> DELIMITER $
mysql> CREATE PROCEDURE pr_add (a INT, b INT)
    -> BEGIN
    ->   DECLARE c INT;
    ->   IF a IS NULL THEN SET a = 0; END IF;
    ->   IF b IS NULL THEN SET b = 0; END IF;
    ->   SET c = a + b;
    ->   SELECT c AS sum;
    -> END;
    -> $
mysql> DELIMITER ;

關鍵點:

  • DELIMITER $ 臨時修改分隔符,避免過程體內 ; 被誤判斷
  • DECLARE 宣告區域變數
  • IF ... END IF 條件判斷

命令列呼叫測試


mysql> SET @a = 10;
mysql> SET @b = 20;
mysql> CALL pr_add(@a, @b);
+------+
| sum  |
+------+
| 30   |
+------+

Java (JDBC) 呼叫範例


public class ProcedureTest {
    private static final String DB_URL = "jdbc:mysql://localhost:3306/zjut";
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String USER = "root";
    private static final String PASSWORD = "XXXXX";
    private static final String SQL = "{call pr_add(?,?)}";  // 標準 JDBC escape 語法

    public static void main(String[] args) {
        try {
            Class.forName(DRIVER);
            Connection conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
            CallableStatement cstmt = conn.prepareCall(SQL);
            cstmt.setInt(1, 10);
            cstmt.setInt(2, 20);
            ResultSet rs = cstmt.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getInt("sum"));  // 輸出 30
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

核心 API 說明

類別/方法用途
CallableStatement專門呼叫儲存過程的 Statement 子介面
conn.prepareCall("{call proc(?,?)}")預編譯呼叫語句,{call ...} 為 JDBC 標準語法
cstmt.setInt(index, value)綁定輸入參數
cstmt.executeQuery()執行並返回 ResultSet(適用有結果集的過程)
cstmt.executeUpdate()執行無結果集的過程(如純 DML)
cstmt.registerOutParameter()註冊輸出參數(OUT/INOUT)

進階提示

  • 儲存過程支援 IN、OUT、INOUT 參數模式
  • 複雜邏輯可使用游標、迴圈、條件控制
  • MySQL 8.0+ 支援 CTE、視窗函數,儲存過程能力更強
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved