Open棟梁 wiki
一覧ページ制御方式を決定しておく。
最大表示件数(1画面に表示する最大件数)・最大取得件数(1回の検索で取得する最大レコード件数)は、
configファイルなどに設定し、基本的に、この最大表示件数・最大取得件数に従ってページ制御をする。
ただし、業務要件に応じて件数が異なる可能性があることを考慮し、個別の対応もする。
最大取得件数の指定方法は以下の通り。
Oracle8i R8.1.5以降で、[Row1]列の昇順に上位10件を取得するような場合、ROWNUMを使用できる。
SELECT * FROM (SELECT * FROM Table1 ORDER BY Row1) WHERE ROWNUM <= 10
Microsoft SQL Server 7.0以降で、例えば[Row1]列の昇順に上位10件を取得するような場合、TOP句を使用できる。
SELECT TOP 10 * FROM Table1 ORDER BY Row1
一覧を表示する際のページ制御の有・無は、業務要件に応じて設定する。
SQL Server、DB2データベースなど、.NETのデータ プロバイダは、サーバ カーソルをサポートしていないものが多い。このため、ページ制御をする場合は、はじめに主キー(IDなどの代理キー)のみの結果セットを取得し、その結果セットから表示対象ページのレコードの主キー(IDなどの代理キー)を抽出、再度検索処理をかけ、対象ページの一覧を取得すると良いと考える。
2008/04月現在、唯一OracleのODP.NETデータ プロバイダのDataReader?クラスは、サーバ カーソルをサポートしており、FetchSize?に指定したレコード数だけを順次取得する。このため巨大な結果セットを取得して落ちることが無く、DataAdapter?を使用したデータアクセスより信頼性は高いと言える。ただし、順方向専用カーソルしかサポートしていないため「ページング処理の行の順送り」で多くのラウンド トリップが発生してしまう。
ストアド プロシージャを使用すれば、サーバ サイドでOrder Byで整列した結果セットに対して、データ絞込みのカーソル操作が可能である。このため、ストアド プロシージャに検索条件と、表示するデータの範囲(例えば、101-200件目までなど)を渡すなどしてデータを絞り込むことができる。
SQLを使用した、ページ制御方法は以下の通り。
SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM EMP ORDER BY EMP.ENAME
↓ ページングしたいSQL(上記)を下記のように書き直す。
SELECT * FROM ( SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, ROW_NUMBER() OVER (ORDER BY EMP.ENAME) RNUM FROM EMP ) WHERE RNUM BETWEEN 3 AND 5
SELECT ShipperID, CompanyName, Phone FROM Shippers ORDER BY Shippers.CompanyName
↓ ページングしたいSQL(上記)を下記のように書き直す。
WITH OrderedShippers AS ( SELECT ShipperID, CompanyName, Phone, ROW_NUMBER() OVER (ORDER BY Shippers.CompanyName) AS RNUM FROM Shippers )
SELECT * FROM OrderedShippers WHERE RNUM BETWEEN 3 AND 5