同一支使用 PreparedStatement 綁定 ROWNUM <= ? 的分頁查詢:
SELECT *
FROM (SELECT * FROM entity_hotlink
WHERE hotlink_sort_id = ?
AND hotlink_status = ?
ORDER BY hotlink_order ASC, last_modified_date DESC)
WHERE ROWNUM <= ?
Java 程式碼:pstmt.setInt(3, count);
String sql = "SELECT * FROM (SELECT * FROM entity_hotlink ... ORDER BY ...) WHERE ROWNUM <= " + count; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, hotlinkSortId); pstmt.setInt(2, hotlinkStatus); -- 不再綁定第 3 參數
此寫法在兩環境均正常。
CURSOR_SHARING 或 _OPTIM_PEEK_USER_BINDS 導致首次執行計畫錯誤固定。_FIX_CONTROL 相關修正在 RAC 節點間不一致。V$SQL_BIND_CAPTURE 實際綁定值是否正確傳遞。ALTER SESSION SET "_OPTIM_PEEK_USER_BINDS"=FALSE; 關閉窺探測試。V$SQL_PLAN 差異。ROW_NUMBER() OVER + OFFSET/FETCH (12c+)。OFFSET :offset ROWS FETCH NEXT :limit ROWS ONLY,綁定變數穩定可靠。