// 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();
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;
CallableStatement cs = conn.prepareCall("{call HYQ.TESTA(?,?)}");
cs.setString(1, "100");
cs.setString(2, "TestOne");
cs.execute();
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;
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);
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
END TESTPACKAGE;
CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR OUT TESTPACKAGE.Test_CURSOR) IS
BEGIN
OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;
END TESTC;
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。
setXxx(index) / registerOutParameter(index, type) / getXxx(index) 的 index 嚴格對應存儲過程定義的參數順序(從 1 開始)。Types,游標用 OracleTypes.CURSOR。ResultSet → Statement → Connection,建議使用 try-with-resources。conn.commit() 或過程內 COMMIT。SQLException,記錄 SQL 錯誤碼與狀態,便於排查 ORA-xxxxx 錯誤。SimpleJdbcCall 簡化參數綁定與結果映射。<select statementType="CALLABLE"> {call proc(#{p1,mode=IN}, #{p2,mode=OUT, jdbcType=VARCHAR})} </select>@NamedStoredProcedureQuery + StoredProcedureQuery。