傳統分頁寫法仰賴主鍵配合 ROWNUM,但遇到無主鍵表時,可利用 ROWID 這個物理位址偽欄位達成相同效果。ROWID 不會因排序、查詢甚至 UPDATE 而改變,適合作為穩定的唯一識別碼。
SELECT e.* FROM scott.emp e JOIN ( SELECT empno id, ROWNUM rn FROM scott.emp ) pg ON e.empno = pg.id WHERE pg.rn BETWEEN 5 AND 10;
SELECT e.* FROM scott.emp e JOIN ( SELECT ROWID rid, ROWNUM rn FROM scott.emp ) pg ON e.ROWID = pg.rid WHERE pg.rn BETWEEN 5 AND 10;
ROWID 編碼包含:資料檔號、區塊號、列號、物件號,唯一且穩定。ROWID, ROWNUM 對應表,外層再 JOIN 回主表取欄位。SELECT * FROM scott.emp ORDER BY empno OFFSET 4 ROWS FETCH NEXT 6 ROWS ONLY;
Oracle 12c 引入 ANSI 標準 OFFSET ... FETCH,語意更清晰,建議新專案優先使用。