首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Java 呼叫 Oracle 預存函數完整範例:IN/OUT 參數處理詳解

     編輯:Oracle 資料庫相關知識

核心類:CallableStatement

所有預存函數/過程調用均通過 Connection.prepareCall(String sql) 獲取 CallableStatement 實例,SQL 格式為 {? = call function_name(?,...)}。

四種參數模式完整代碼

1. 無參數函數(返回 VARCHAR)

CallableStatement cs = connection.prepareCall("{? = call myfunc}");
cs.registerOutParameter(1, Types.VARCHAR); // 註冊返回值類型
cs.execute();
String retValue = cs.getString(1);

2. 僅 IN 參數函數

cs = connection.prepareCall("{? = call myfuncin(?)}");
cs.registerOutParameter(1, Types.VARCHAR);
cs.setString(2, "a string"); // 設置 IN 參數
cs.execute();
retValue = cs.getString(1);

3. 僅 OUT 參數函數

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 參數值

4. IN/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 修改後的值

關鍵最佳實踐

  • 參數索引從 1 開始:第 1 個永遠是函數返回值,後續依次為 IN/OUT/INOUT 參數。
  • 類型精確匹配:registerOutParameter 必須與數據庫端定義的數據類型一致(如 Types.VARCHAR、Types.NUMERIC、Types.DATE)。
  • 資源關閉:在 finally 塊中調用 cs.close() 釋放游標,防止 ORA-01000。
  • 異常處理:捕獲 SQLException 並記錄錯誤碼(e.getErrorCode())與 SQLState,便於診斷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved