SQL Server/Sybase:預存程序結尾直接 SELECT ... 即可回傳結果集。
Oracle:必須使用 REF CURSOR 游標變數 回傳結果集。
CREATE TABLE hotline (country VARCHAR2(50), pno VARCHAR2(50));
CREATE OR REPLACE PACKAGE PKG_HOTLINE IS
TYPE HotlineCursorType IS REF CURSOR;
FUNCTION getHotline RETURN HotlineCursorType;
END PKG_HOTLINE;
CREATE OR REPLACE PACKAGE BODY PKG_HOTLINE IS
FUNCTION getHotline RETURN HotlineCursorType IS
hotlineCursor HotlineCursorType;
BEGIN
OPEN hotlineCursor FOR SELECT * FROM hotline;
RETURN hotlineCursor;
END;
END PKG_HOTLINE;
TYPE ... IS REF CURSOR 建立游標型別OPEN ... FOR SELECT 綁定查詢VAR rs REFCURSOR;
EXEC :rs := PKG_HOTLINE.getHotline;
PRINT rs;
public void openCursor() {
Connection conn = null;
ResultSet rs = null;
CallableStatement stmt = null;
String sql = "{? = call PKG_HOTLINE.getHotline()}";
try {
conn = getConnection(); // 自行實作
stmt = conn.prepareCall(sql);
stmt.registerOutParameter(1, OracleTypes.CURSOR); // 關鍵:註冊 CURSOR 型別
stmt.execute();
rs = ((OracleCallableStatement) stmt).getCursor(1); // 取得 ResultSet
while (rs.next()) {
String country = rs.getString(1);
String pno = rs.getString(2);
System.out.println("country:" + country + "|pno:" + pno);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
closeConnection(conn, rs, stmt); // 自行實作資源關閉
}
}
ResultSetResultSet 完全一致PreparedStatement 直寫 SQL,減少資料庫端負擔與網路往返oracle.jdbc.OracleTypes、oracle.jdbc.OracleCallableStatement(廠商專用類)ResultSet 使用完畢必須關閉,避免資料庫端遊標洩漏setFetchSize) 提升效能