Oracle 無 MySQL LIMIT 子句,分頁需借助 ROWNUM 偽列實現。本文提供一套封裝良好的 PHP 類方法,涵蓋連線管理、總筆數統計、分頁 SQL 組裝、結果集獲取,適合直接集成到項目中。
SELECT * FROM (
SELECT ROWNUM AS row_num, r.* FROM (
{$original_sql}
) r WHERE ROWNUM <= {$end_row}
) WHERE {$start_row} <= row_num
$end_row 條並賦予行號$start_row ~ $end_rowfunction getCount($sql) {
$sub = 'SELECT COUNT(*) ' . stristr($sql, 'FROM');
return $this->getOne($sub);
}
function getPage($sql, $total, $page, $pageSize = 20) {
$start = ($page - 1) * $pageSize + 1;
$start = $start > $total ? 1 : $start;
$end = min($start + $pageSize - 1, $total);
$pageSql = "SELECT * FROM (
SELECT ROWNUM AS row_num, r.* FROM (
{$sql}
) r WHERE ROWNUM <= {$end}
) WHERE {$start} <= row_num";
return $this->getAll($pageSql);
}
function getAll($sql, $start = 0, $rows = -1) {
$this->conn = $this->conn ?? $this->connect();
$sth = oci_parse($this->conn, $sql);
oci_execute($sth, OCI_DEFAULT);
oci_fetch_all($sth, $res, $start, $rows, OCI_FETCHSTATEMENT_BY_ROW + OCI_ASSOC);
return $res;
}
$sql = "SELECT * FROM users WHERE status = 1 ORDER BY created_at DESC"; $total = $db->getCount($sql); $list = $db->getPage($sql, $total, $currentPage, 20);
ORDER BY,否則分頁結果不穩定ROWNUM 方案隨頁碼增大效能下降;百萬級以上建議用 ROW_NUMBER() OVER() (Oracle 12c+) 或游標分頁oci_commit()/oci_rollback()oci_pconnect 減少握手開銷此方案在中小型 Oracle 專案中表現穩定,代碼結構清晰,易於維護擴展。