使用 JDBC CallableStatement 呼叫 Oracle 預存函數/程序,需正確註冊輸出參數型別、設定輸入參數、執行並取得回傳值。本文涵蓋無參、IN、OUT、IN OUT 四種參數模式的完整範例。
Connection.prepareCall("{? = call func_name(?)}"):大括號語法,? 為佔位符,函數回傳值佔第一個 ?。cs.registerOutParameter(index, Types.VARCHAR):註冊 OUT/IN OUT 參數與回傳值的 SQL 型別。cs.setString(index, value):設定 IN/IN OUT 參數值。cs.execute():執行。cs.getString(index) / getInt() 等:取得 OUT 參數與回傳值。CallableStatement cs;
try {
// 1. 無參函數,回傳 VARCHAR
cs = conn.prepareCall("{? = call myfunc}");
cs.registerOutParameter(1, Types.VARCHAR);
cs.execute();
String ret = cs.getString(1);
// 2. 一個 IN 參數函數
cs = conn.prepareCall("{? = call myfuncin(?)}");
cs.registerOutParameter(1, Types.VARCHAR);
cs.setString(2, "a string");
cs.execute();
ret = cs.getString(1);
// 3. 一個 OUT 參數函數
cs = conn.prepareCall("{? = call myfuncout(?)}");
cs.registerOutParameter(1, Types.VARCHAR); // 回傳值
cs.registerOutParameter(2, Types.VARCHAR); // OUT 參數
cs.execute();
ret = cs.getString(1);
String outParam = cs.getString(2);
// 4. 一個 IN OUT 參數函數
cs = conn.prepareCall("{? = call myfuncinout(?)}");
cs.registerOutParameter(1, Types.VARCHAR);
cs.registerOutParameter(2, Types.VARCHAR);
cs.setString(2, "a string"); // 設定 IN OUT 初始值
cs.execute();
ret = cs.getString(1);
outParam = cs.getString(2); // 取得修改後的值
} catch (SQLException e) {
e.printStackTrace();
}
registerOutParameter 必須在 execute() 前呼叫。setXxx 設定初始值,執行後再 getXxx 取得新值。VARCHAR2 → Types.VARCHAR,NUMBER → Types.NUMERIC/DECIMAL,DATE → Types.TIMESTAMP。{call proc_name(?, ?)},無回傳值佔位符。掌握 CallableStatement 標準模式,即可安全高效地從 Java 整合 Oracle 預存邏輯。