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 |
+------+
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();
}
}
}
| 類別/方法 | 用途 |
|---|---|
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 參數模式