様々な基本になるサンプルを記録しています。

不定期更新です。

記事のサイドに使用している商品の紹介も掲載しているので、良ければご覧ください。

【Oracle】データ件数におけるページ分けの計算

タイトルの表現がちょっとよく分からなかったら申し訳ないのだが、
よく、WEBとかで〇〇件中、XX~YY件とかって分けて表示することがあると思う。
今回はその総件数の中で、どのページにどこからどこまでのデータを何件表示されるかという計算ロジックを作ってみた。

これも使用するTYPEは以下を参照

fubukin.hatenablog.com

create or replace FUNCTION PAGE_CALC (
/*
引  数:       
DATA_COUNT:データ総件数
CUR_PAGE  :現在のページ
VIEW_COUNT:表示する件数

戻り値:          

VALUE01:総ページ数
VALUE02:現在のページ数
VALUE03:現在のページの最初の行位置
VALUE04:現在のページの最後の行位置
*/

        DATA_COUNT   NUMBER,
        CUR_PAGE     NUMBER,
        VIEW_COUNT   NUMBER
    ) RETURN STD_VALUE4_TABLE
        PIPELINED
    IS
    /* レコード格納定義 */
        W_RET_REC   STD_VALUE4;
    BEGIN

        W_RET_REC                  :=STD_VALUE4('0','0','0','0');

    /*総ページ数 データ件数÷表示件数の商を切り上げ*/
        W_RET_REC.VALUE01       := TO_CHAR(CEIL(DATA_COUNT / VIEW_COUNT));
    /*現在のページ そのまま*/
        W_RET_REC.VALUE02       := TO_CHAR(CUR_PAGE);
    /*現在のページが最終ページ以上のページだったら最終ページに合わせる*/
        IF
            TO_NUMBER(W_RET_REC.VALUE02)   >= TO_NUMBER(W_RET_REC.VALUE01)
        THEN
            W_RET_REC.VALUE02   := TO_CHAR(W_RET_REC.VALUE01);
        END IF;
    /*最初の行位置 表示件数 * (現在のページ-1) + 1*/
        W_RET_REC.VALUE03      := TO_CHAR(VIEW_COUNT * ( TO_NUMBER(W_RET_REC.VALUE02) - 1 ) + 1);
    /*最後の行位置 表示件数 * 現在のページ*/
        W_RET_REC.VALUE04        := TO_CHAR(VIEW_COUNT * TO_NUMBER(W_RET_REC.VALUE02));
    /*最後の行位置が最終行よりも上回ったら最終行に合わせる*/
        IF
            TO_NUMBER(W_RET_REC.VALUE04) >= DATA_COUNT
        THEN
            W_RET_REC.VALUE04   := TO_CHAR(DATA_COUNT);
        END IF;
    /*表関数にレコード追加*/
        PIPE ROW ( W_RET_REC );
        RETURN;
    /*エラーの場合は0を返す。*/
    EXCEPTION
        WHEN OTHERS THEN
            RETURN;
    END;

f:id:karinto441:20181026233820p:plain

この計算情報って、どんなプログラムでも最初から作ると結構、間違いやすい。
これを参考にして違うプログラムでも作ってみるといいかもしれない。