Oracle存儲過程無直接返回值,所有返回通過OUT參數實現。返回結果集(集合類型)時,不能使用普通參數,必須定義REF CURSOR類型,而自定義類型必須在Package規格中聲明。
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;
核心機制:將游標(指向結果集的指針)作為OUT參數返回。
CallableStatement proc = conn.prepareCall("{call hyq.testc(?)}");
proc.registerOutParameter(1, OracleTypes.CURSOR);
proc.execute();
ResultSet rs = (ResultSet) proc.getObject(1);
while (rs.next()) {
System.out.println(rs.getString(1) + " | " + rs.getString(2));
}
oracle.jdbc.OracleTypes註冊游標類型getObject()獲取並強轉為ResultSet可結合動態SQL構建靈活查詢:OPEN p_CURSOR FOR 'SELECT * FROM ' || table_name; 實現通用分頁、報表查詢等場景。