Web 無狀態環境下不可長期持有游標;ROWNUM 僅在行被取出時分配,直接 WHERE ROWNUM BETWEEN 30 AND 49 永遠無資料。
SELECT * FROM ( SELECT ROWNUM rn, a.* FROM all_objects a WHERE ROWNUM <= :max_row ) WHERE rn >= :min_row;
使用 :min_row, :max_row 綁定變數,使相同 SQL 文本共享游標,避免每次硬解析。
CREATE OR REPLACE PROCEDURE search_page (
p_min IN INTEGER,
p_max IN INTEGER,
p_rc OUT SYS_REFCURSOR
) IS
BEGIN
OPEN p_rc FOR
SELECT * FROM (
SELECT ROWNUM rn, a.* FROM all_objects a WHERE ROWNUM <= p_max
) WHERE rn >= p_min;
END;
/
ROWNUM 在 ORDER BY 之後計算,若需排序分頁請在內層查詢加 ORDER BY。ROWNUM 條件時短路停止,適合首頁顯示;CBO 需配合 FIRST_ROWS(n) Hint。OFFSET ... ROWS FETCH NEXT ... ROWS ONLY 標準語法。