首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實現 Oracle 分頁查詢:基於 ROWNUM 的高效通用方案

     編輯:PHP 相關知識

PHP 實現 Oracle 分頁查詢:基於 ROWNUM 的高效通用方案

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_row

關鍵方法實現

1. 獲取總筆數

function getCount($sql) {
    $sub = 'SELECT COUNT(*) ' . stristr($sql, 'FROM');
    return $this->getOne($sub);
}

2. 分頁查詢入口

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);
}

3. 底層執行與資源管理

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);

效能與避坑提醒

  • 確保原始 SQL 含 ORDER BY,否則分頁結果不穩定
  • 大數據量時,ROWNUM 方案隨頁碼增大效能下降;百萬級以上建議用 ROW_NUMBER() OVER() (Oracle 12c+) 或游標分頁
  • OCI_DEFAULT 模式需手動 oci_commit()/oci_rollback()
  • 長連線建議啟用 oci_pconnect 減少握手開銷

此方案在中小型 Oracle 專案中表現穩定,代碼結構清晰,易於維護擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved