Firebird PDO 驅動程式目前似乎不支援 PDO::nextRowset()。真可惜。
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)
PDOStatement::nextRowset — 前進到多行集陳述式控制碼中的下一個行集
某些資料庫伺服器支援傳回多個行集(也稱為結果集)的預存程序。 PDOStatement::nextRowset() 讓您可以存取與 PDOStatement 物件關聯的第二個和後續行集。每個行集可以與前一個行集具有不同的欄位集。
此函式沒有參數。
範例 #1 從預存程序返回多個結果集
以下範例顯示如何呼叫一個名為 MULTIPLE_ROWSETS
的預存程序,該程序返回三個結果集。我們使用 do-while 迴圈來呼叫 PDOStatement::nextRowset() 方法,直到它返回 false
並在沒有更多結果集可用時終止迴圈。
<?php
$sql = 'CALL multiple_rowsets()';
$stmt = $conn->query($sql);
$i = 1;
do {
$rowset = $stmt->fetchAll(PDO::FETCH_NUM);
if ($rowset) {
printResultSet($rowset, $i);
}
$i++;
} while ($stmt->nextRowset());
function printResultSet(&$rowset, $i) {
print "結果集 $i:\n";
foreach ($rowset as $row) {
foreach ($row as $col) {
print $col . "\t";
}
print "\n";
}
print "\n";
}
?>
以上範例將輸出
Result set 1: apple red banana yellow Result set 2: orange orange 150 banana yellow 175 Result set 3: lime green apple red banana yellow
在 MSSQL 上以及 'dsn' => 'dblib:...'
如果您知道結果集的數量,就不要使用 do...while 迴圈。
<?php
do {
$pdoStatement->fetchAll(\PDO::FETCH_ASSOC);
} while (
$pdoStatement->nextRowset()
);
?>
當我使用 fetchAll 取得大量資料 (超過 30 筆) 給第二個 nextRowset 時,會出現 Segmentation fault 錯誤。
使用逐步執行而不是 do...while 迴圈可以修正這個錯誤
<?php
$pdoStatement->fetchAll(\PDO::FETCH_ASSOC);
$pdoStatement->nextRowset();
$pdoStatement->fetchAll(\PDO::FETCH_ASSOC);
?>