【Oracle】データ件数におけるページ分けの計算
タイトルの表現がちょっとよく分からなかったら申し訳ないのだが、
よく、WEBとかで〇〇件中、XX~YY件とかって分けて表示することがあると思う。
今回はその総件数の中で、どのページにどこからどこまでのデータを何件表示されるかという計算ロジックを作ってみた。
これも使用するTYPEは以下を参照
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;
この計算情報って、どんなプログラムでも最初から作ると結構、間違いやすい。
これを参考にして違うプログラムでも作ってみるといいかもしれない。