Skip to content

Instantly share code, notes, and snippets.

@eight
Created February 24, 2010 04:16
Show Gist options
  • Save eight/313091 to your computer and use it in GitHub Desktop.
Save eight/313091 to your computer and use it in GitHub Desktop.
<?php
/**
* Oracleページ制御用SQL生成クラス
*
* Oracle8以降(?たぶん)でPostgreSQL、MySQLでいうLIMIT、OFFSETを利用するためのPHP4用クラス。
* データベースに実際にアクセスするのではなくSQLを返す。
* このクラスの関数はOraclePagination::PageCount()のようにstaticに利用する。
* 1ページ分のレコードだけを抽出するSQL文、行数ではなく何ページあるかを返すSQLを生成する。
*
* $page_numberに指定したページの行を選択する。$lines_per_pageには1ページあたりの行数を指定。
* function SelectPage($sql,$page_number,$lines_per_page);
*
* 最大$limit行に制限する。$offsetには読み飛ばす行数を指定。$offsetが0(デフォルト)なら1行目からということ。
* function SelectLimit($sql,$limit,$offset=0);
*
* ページ数をカウントするsqlを返す。$lines_per_pageには1ページあたりの行数を指定。$colnameに列名を指定できる。
* function PageCount($sql,$lines_per_page,$colname="");
*
* 行数をカウントするsqlを返す。$colnameに列名を指定できる。
* function RowCount($sql,$colname="");
*
* @package COMMON.class
* @author Fabrice Co. <webmaster@fabrice.co.jp>
* @version 1.0
* @filesource
*/
/**
* Oracle用にページングするときに必要なSQLを生成するクラス
* @package COMMON.class
* @author Fabrice Co. <webmaster@fabrice.co.jp>
*/
class OraclePagination {
/**
* 1ページ文だけSELECTするSQLを返す
*
* @param string $sql 対象となるSQL
* @param integer $page_number 抽出するページ番号。>0
* @param integer $lines_per_page 1ページあたりの行数。>0
* @return string
* @static
* @access public
* @see SelectLimit()
*/
function SelectPage($sql,$page_number,$lines_per_page) {
$offset = ($page_number * $lines_per_page) - $lines_per_page;
return OraclePagination::SelectLimit($sql,$lines_per_page,$offset);
}
/**
* PostgreSQLやMySQLのLIMIT,OFFSETを使う
*
* sql文を渡すとrownumを使ったsqlを返す。sqlを返すのであって実行はしない。
*
* @param string $sql 対象となるSQL
* @param integer $limit 返される最大行数
* @param integer $offset 行を始める前に飛ばす行数
* @return string
* @static
* @access public
*/
function SelectLimit($sql,$limit,$offset=0) {
$limited_rownum = $limit+$offset;
$result = <<<EOD
SELECT * FROM
(SELECT ROWNUM AS COLUMN_ROWNUM,t.* FROM ($sql) t)
WHERE COLUMN_ROWNUM <= $limited_rownum AND COLUMN_ROWNUM > $offset
ORDER BY COLUMN_ROWNUM
EOD;
return $result;
}
/*
$result = <<<EOD
SELECT * FROM
(
SELECT rownum,* FROM ($sql)
WHERE ROWNUM <= $limited_rownum
MINUS
SELECT * FROM ($sql)
WHERE ROWNUM <= $offset
)
EOD;
*/
/**
* sqlを渡すと総件数を返すsqlにして返してくれる
*
* @param string $sql 対象となるSQL
* @param string $colname 結果列名デフォルトは無し
* @return string
* @static
* @access public
*/
function RowCount($sql,$colname="") {
$result = <<<EOD
SELECT MAX(ROWNUM) $colname
FROM ($sql)
EOD;
return $result;
}
/**
* sqlを渡して1ページあたりの行数を渡すとページ数を返すsqlにして返してくれる
*
* @param string $sql 対象となるSQL
* @param string $colname 結果列名デフォルトは無し
* @return string
* @static
* @access public
*/
function PageCount($sql,$lines_per_page,$colname="") {
$result = <<<EOD
SELECT CEIL(MAX(ROWNUM) / $lines_per_page) $colname
FROM ($sql)
EOD;
return $result;
}
} //end OraclePagination
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment