Created
February 24, 2010 04:16
-
-
Save eight/313091 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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