*[.NET]外だしSQL+ページング(Oracle)

  • 次回実装するとき用にメモを残します
    • ページング用のParameterBeanをsql2entityで作成するためにはParameterBeanの宣言のところを以下の様に書く
!HogePmb extends SPB!

これを行うとParameterBeanで、何件ずつで、何ページ目でというのが指定ができるようになる

HogePmb pmb = new HogePmb();
pmb.Paging(5,10);
  • ただし、SQL側にちょっとした細工を行う必要がある。
    • /*IF pmb.IsPaging*/.... /*END*/
      • こちらで囲った所はページング検索で使用される。どういうことかというと、ページング検索を行うときに、レコードの全件の数を取得するために、カウント用と実レコード分でわけるために必要になってくる(Count用のSQLを別途用意するでもSQLが重複しそうだけど可能)。
/*IF pmb.IsPaging*/
select hoge_id
-- ELSE select count(*)
/*END*/
from Hoge
  • ここだけではなくて、カウント取得に関係ない箇所がある場合はこの方法でSQLから除外してあげる(order byとか。検索条件とかは逆に消してはダメ)
  • さらにOracleの場合はrownumで取得件数を指定された数だけ取るように細工する。
where rownum > /*$pmb.PageStartIndex*/1
   and rownum <= /*$pmb.PageEndIndex*/10
  • PageStartIndexとPageEndIndexはextends SPBをつけることによってParameterBeanに追加してくれる。そちらを利用しなくてもpmb.Pagingを利用すれば自動でやってくれる。
  • ここで注意したいのが、rownumを検索条件で絞られたデータに対して絞り込む様に書くこと。多分、一回検索を条件付でかけたものAに対してselect * from Aというような感じにしたものに対してwhereを追加することになると思う。ここがちょっとややこしい。
  • 上記はManualPagingと呼ばれる方法を利用するときの手順。
    • bhv.OutsideSql.ManualPaging.SelectPage()みたいな感じで実行できる。
    • そのほかAutoPagingと呼ばれるものがあり、こちらは最後のrownum部分は必要がないかわりに全件データを取得して、C#のプログラム側でページング部分処理を行っている。