示範使用 CallableStatement 呼叫 Oracle 預存函數,涵蓋無參、IN、OUT、IN/OUT 參數與回傳值的完整模式。
// 1. 無參函數,回傳 VARCHAR
CallableStatement 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, "input value");
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();
String retVal = 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, "initial value"); // 同時作為輸入
cs.execute();
retVal = cs.getString(1);
outParam = cs.getString(2); // 取得修改後的值
registerOutParameter 註冊 JDBC 型別setXxx 設定初始值,執行後再 getXxx 取得更新值{? = call ...} 語法呼叫函數;呼叫程序用 {call ...}實務建議:將呼叫邏輯封裝於 DAO 層,統一異常處理與資源釋放,避免在業務邏輯中直接操作 CallableStatement。