Best practice for pagination in Oracle?

前端 未结 7 1386
别那么骄傲
别那么骄傲 2020-11-28 07:22

Problem: I need write stored procedure(s) that will return result set of a single page of rows and the number of total rows.

Solution A: I create tw

相关标签:
7条回答
  • 2020-11-28 08:21

    A clean way to organize your SQL code could be trough WITH statement.

    The reduced version implements also total number of results and total pages count.

    For example

    WITH SELECTION AS (
        SELECT FIELDA, FIELDB, FIELDC FROM TABLE), 
    NUMBERED AS (
        SELECT 
        ROW_NUMBER() OVER (ORDER BY FIELDA) RN, 
        SELECTION.*
        FROM SELECTION)
    SELECT
        (SELECT COUNT(*) FROM NUMBERED) TOTAL_ROWS,
        NUMBERED.*
    FROM NUMBERED
    WHERE 
        RN BETWEEN ((:page_size*:page_number)-:page_size+1) AND (:page_size*:page_number)
    

    This code gives you a paged resultset with two more fields:

    • TOTAL_ROWS with the total rows of your full SELECTION
    • RN the row number of the record

    It requires 2 parameter: :page_size and :page_number to slice your SELECTION

    Reduced Version

    Selection implements already ROW_NUMBER() field

    WITH SELECTION AS (
        SELECT 
            ROW_NUMBER() OVER (ORDER BY FIELDA) RN,
            FIELDA, 
            FIELDB, 
            FIELDC 
        FROM TABLE) 
    SELECT
        :page_number PAGE_NUMBER,
        CEIL((SELECT COUNT(*) FROM SELECTION ) / :page_size) TOTAL_PAGES,
        :page_size PAGE_SIZE,
        (SELECT COUNT(*) FROM SELECTION ) TOTAL_ROWS,
        SELECTION.*
    FROM SELECTION 
    WHERE 
        RN BETWEEN ((:page_size*:page_number)-:page_size+1) AND (:page_size*:page_number)
    
    0 讨论(0)
提交回复
热议问题