首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 調用 Oracle 存儲過程全攻略:無返回值、OUT 參數、REF CURSOR 三大模式

     編輯:Java 相關知識

通用調用模板

// 1. 準備調用語法:{call 包名.過程名(?,?...)}
String sql = "{call PKG_NAME.PROC_NAME(?,?,?)}";
// 2. 獲取連接
Connection conn = DriverManager.getConnection(url, user, pwd);
// 3. 創建 CallableStatement
CallableStatement cs = conn.prepareCall(sql);
// 4. 綁定 IN 參數
cs.setInt(1, id);
cs.setString(2, name);
// 5. 註冊 OUT 參數
cs.registerOutParameter(3, Types.VARCHAR);
// 6. 執行
cs.execute();
// 7. 獲取 OUT 參數
String result = cs.getString(3);
// 8. 關閉資源
cs.close(); conn.close();

模式一:無返回值(純執行)

Oracle 定義

CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2, PARA2 IN VARCHAR2) AS
BEGIN
    INSERT INTO HYQ.B_ID (I_ID, I_NAME) VALUES (PARA1, PARA2);
END TESTA;

Java 調用

CallableStatement cs = conn.prepareCall("{call HYQ.TESTA(?,?)}");
cs.setString(1, "100");
cs.setString(2, "TestOne");
cs.execute();

模式二:OUT 參數返回標量值

Oracle 定義

CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2, PARA2 OUT VARCHAR2) AS
BEGIN
    SELECT I_NAME INTO PARA2 FROM TESTTB WHERE I_ID = PARA1;
END TESTB;

Java 調用

CallableStatement cs = conn.prepareCall("{call HYQ.TESTB(?,?)}");
cs.setString(1, "100");
cs.registerOutParameter(2, Types.VARCHAR); // 位置對應 OUT 參數順序
cs.execute();
String name = cs.getString(2); // 獲取 OUT 值
System.out.println(name);

模式三:返回結果集(REF CURSOR)

步驟 1:創建包定義游標類型

CREATE OR REPLACE PACKAGE TESTPACKAGE AS
    TYPE Test_CURSOR IS REF CURSOR;
END TESTPACKAGE;

步驟 2:存儲過程輸出游標

CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR OUT TESTPACKAGE.Test_CURSOR) IS
BEGIN
    OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;
END TESTC;

步驟 3:Java 獲取 ResultSet

CallableStatement cs = conn.prepareCall("{call hyq.testc(?)}");
cs.registerOutParameter(1, OracleTypes.CURSOR); // 需 oracle 專用類型
cs.execute();
ResultSet rs = (ResultSet) cs.getObject(1); // 轉換為 ResultSet
while (rs.next()) {
    System.out.println(rs.getString(1) + " " + rs.getString(2));
}

注意:需引入 ojdbc.jar 以使用 oracle.jdbc.OracleTypes。

關鍵注意點總結

  1. 參數位置:setXxx(index) / registerOutParameter(index, type) / getXxx(index) 的 index 嚴格對應存儲過程定義的參數順序(從 1 開始)。
  2. OUT 參數類型:標量用標準 Types,游標用 OracleTypes.CURSOR。
  3. 資源關閉順序:ResultSet → Statement → Connection,建議使用 try-with-resources。
  4. 事務控制:存儲過程內部若有 DML,默認不自動提交,需在 Java 端 conn.commit() 或過程內 COMMIT。
  5. 異常處理:捕獲 SQLException,記錄 SQL 錯誤碼與狀態,便於排查 ORA-xxxxx 錯誤。

現代化替代方案

  • Spring JdbcTemplate:SimpleJdbcCall 簡化參數綁定與結果映射。
  • MyBatis:<select statementType="CALLABLE"> {call proc(#{p1,mode=IN}, #{p2,mode=OUT, jdbcType=VARCHAR})} </select>
  • JPA/Hibernate:@NamedStoredProcedureQuery + StoredProcedureQuery。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved