CallableStatement所有預存函數/過程調用均通過 Connection.prepareCall(String sql) 獲取 CallableStatement 實例,SQL 格式為 {? = call function_name(?,...)}。
CallableStatement cs = connection.prepareCall("{? = call myfunc}");
cs.registerOutParameter(1, Types.VARCHAR); // 註冊返回值類型
cs.execute();
String retValue = cs.getString(1);
cs = connection.prepareCall("{? = call myfuncin(?)}");
cs.registerOutParameter(1, Types.VARCHAR);
cs.setString(2, "a string"); // 設置 IN 參數
cs.execute();
retValue = cs.getString(1);
cs = connection.prepareCall("{? = call myfuncout(?)}");
cs.registerOutParameter(1, Types.VARCHAR); // 返回值
cs.registerOutParameter(2, Types.VARCHAR); // OUT 參數
cs.execute();
retValue = cs.getString(1); // 函數返回值
String outParam = cs.getString(2); // OUT 參數值
cs = connection.prepareCall("{? = call myfuncinout(?)}");
cs.registerOutParameter(1, Types.VARCHAR);
cs.registerOutParameter(2, Types.VARCHAR);
cs.setString(2, "a string"); // 設置 IN/OUT 初始值
cs.execute();
retValue = cs.getString(1); // 函數返回值
outParam = cs.getString(2); // IN/OUT 修改後的值
registerOutParameter 必須與數據庫端定義的數據類型一致(如 Types.VARCHAR、Types.NUMERIC、Types.DATE)。finally 塊中調用 cs.close() 釋放游標,防止 ORA-01000。SQLException 並記錄錯誤碼(e.getErrorCode())與 SQLState,便於診斷。