提供標準化、跨 DBMS 的儲存過程調用介面。繼承 Statement (通用 SQL) 與 PreparedStatement (IN 參數),新增 OUT/INOUT 參數處理能力。
{call 過程名[(?, ?, ...)]}
{? = call 過程名[(?, ?, ...)]} -- 有返回值 (函數)
{call 過程名} -- 無參數
方括號內為可選,實際 SQL 不含方括號。? 為參數佔位符 (IN/OUT/INOUT)。
supportsStoredProcedures():是否支援儲存過程。getProcedures():獲取儲存過程元資料描述。CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
cstmt.registerOutParameter(1, Types.TINYINT); // 第 1 參數 OUT
cstmt.registerOutParameter(2, Types.DECIMAL, 3); // 第 2 參數 OUT,小數 3 位
registerOutParameter 使用 JDBC 型別 (java.sql.Types) 對應資料庫返回型別。
// 設置 IN 參數 (繼承 PreparedStatement setXXX)
cstmt.setInt(1, 100);
// 執行
boolean hasResultSet = cstmt.execute(); // 或 executeQuery/update
// 獲取 OUT 參數 (getXXX 對應 Java 型別)
byte b = cstmt.getByte(1);
BigDecimal bd = cstmt.getBigDecimal(2);
儲存過程 reviseTotal(INOUT total TINYINT):
CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");
cstmt.setByte(1, 25); // 設置 IN 值
cstmt.registerOutParameter(1, Types.TINYINT); // 註冊 OUT 型別 (需一致)
cstmt.executeUpdate();
byte newVal = cstmt.getByte(1); // 獲取更新後的值
建議順序:先處理所有 ResultSet (含多結果集循環 getResultSet()/getUpdateCount()/getMoreResults()),最後讀取 OUT 參數。某些 DBMS 要求此順序。
資料庫返回 JDBC NULL 時,getXXX 轉換為 Java null/0/false。判斷真實 NULL 唯一方法:緊隨 getXXX 後調用 wasNull(),返回 true 表示原值為 NULL。
addBatch/executeBatch) 而非單條儲存過程。CallableStatement 狀態重置 (clearParameters)。