PHP Conference Japan 2024

oci_fetch_all

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_fetch_all將查詢的多個列擷取到二維陣列中

說明

oci_fetch_all(
    資源 $statement,
    陣列 &$output,
    整數 $offset = 0,
    整數 $limit = -1,
    整數 $flags = OCI_FETCHSTATEMENT_BY_COLUMN | OCI_ASSOC
): 整數

將查詢的多個列擷取到二維陣列中。預設情況下,會傳回所有列。

對於使用 oci_execute() 執行的每個查詢,只能呼叫此函式一次。

參數

敘述

一個有效的 OCI8 陳述式識別碼,由 oci_parse() 建立並由 oci_execute() 執行,或者是一個 REF CURSOR 陳述式識別碼。

輸出

用於存放返回列的變數。

在 Oracle 支援轉換的情況下,LOB 欄位會以字串形式返回。

關於如何擷取數據和類型,請參閱 oci_fetch_array() 以取得更多資訊。

偏移量

擷取結果時要捨棄的初始列數。預設值為 0,因此會返回從第一列開始的資料。

限制

要返回的列數。預設值為 -1,表示返回從 offset + 1 開始的所有列。

旗標

參數 flags 指示陣列結構以及是否應使用關聯式陣列。

oci_fetch_all() 陣列結構模式
常數 說明
OCI_FETCHSTATEMENT_BY_ROW 外部陣列將針對每一個查詢列包含一個子陣列。
OCI_FETCHSTATEMENT_BY_COLUMN 外部陣列將針對每一個查詢欄包含一個子陣列。這是預設值。

陣列可以透過欄標題或數字索引。只會返回一種索引模式。

oci_fetch_all() 陣列索引模式
常數 說明
OCI_NUM 每個欄位的陣列使用數值索引。
OCI_ASSOC 每個欄位的陣列使用關聯式索引。這是預設值。

使用加法運算子「+」來選擇陣列結構和索引模式的組合。

Oracle 預設的非大小寫敏感欄位名稱將具有大寫陣列鍵。大小寫敏感的欄位名稱將使用完全相同的欄位大小寫作為陣列鍵。在 output 上使用 var_dump() 來驗證每個查詢使用的適當大小寫。

具有多個同名欄位的查詢應使用欄位別名。否則,關聯式陣列中只會出現其中一個欄位。

回傳值

返回 output 中的列數,可能為 0 或更多。

範例

範例 #1 oci_fetch_all() 範例

<?php

$conn
= oci_connect('hr', 'welcome', 'localhost/XE');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT POSTAL_CODE, CITY FROM locations WHERE ROWNUM < 3');
oci_execute($stid);

$nrows = oci_fetch_all($stid, $res);

echo
"$nrows 列資料已擷取<br>\n";
var_dump($res);

// var_dump 輸出如下:
// 2 列資料已擷取
// array(2) {
// ["POSTAL_CODE"]=>
// array(2) {
// [0]=>
// string(6) "00989x"
// [1]=>
// string(6) "10934x"
// }
// ["CITY"]=>
// array(2) {
// [0]=>
// string(4) "Roma"
// [1]=>
// string(6) "Venice"
// }
// }

// 將結果格式化輸出
echo "<table border='1'>\n";
foreach (
$res as $col) {
echo
"<tr>\n";
foreach (
$col as $item) {
echo
" <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "")."</td>\n";
}
echo
"</tr>\n";
}
echo
"</table>\n";

oci_free_statement($stid);
oci_close($conn);

?>

範例 #2 使用 OCI_FETCHSTATEMENT_BY_ROWoci_fetch_all() 範例

<?php

$conn
= oci_connect('hr', 'welcome', 'localhost/XE');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT POSTAL_CODE, CITY FROM locations WHERE ROWNUM < 3');
oci_execute($stid);

$nrows = oci_fetch_all($stid, $res, null, null, OCI_FETCHSTATEMENT_BY_ROW);

echo
"$nrows rows fetched<br>\n";
var_dump($res);

// 輸出結果為:
// 擷取到 2 列資料
// array(2) {
// [0]=>
// array(2) {
// ["POSTAL_CODE"]=>
// string(6) "00989x"
// ["CITY"]=>
// string(4) "Roma"
// }
// [1]=>
// array(2) {
// ["POSTAL_CODE"]=>
// string(6) "10934x"
// ["CITY"]=>
// string(6) "Venice"
// }
// }

oci_free_statement($stid);
oci_close($conn);

?>

範例 #3 使用 OCI_NUMoci_fetch_all() 函式

<?php

$conn
= oci_connect('hr', 'welcome', 'localhost/XE');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT POSTAL_CODE, CITY FROM locations WHERE ROWNUM < 3');
oci_execute($stid);

$nrows = oci_fetch_all($stid, $res, null, null, OCI_FETCHSTATEMENT_BY_ROW + OCI_NUM);

echo
"$nrows rows fetched<br>\n";
var_dump($res);

// 輸出結果為:
// 擷取 2 列資料
// array(2) {
// [0]=>
// array(2) {
// [0]=>
// string(6) "00989x"
// [1]=>
// string(4) "Roma"
// }
// [1]=>
// array(2) {
// [0]=>
// string(6) "10934x"
// [1]=>
// string(6) "Venice"
// }
// }

oci_free_statement($stid);
oci_close($conn);

?>

注意事項

備註:

使用 offset 參數非常沒有效率。所有要跳過的資料列都會包含在從資料庫返回到 PHP 的結果集中,然後再被捨棄。更有效率的做法是在 SQL 查詢中限制資料列的偏移量和範圍。參考 oci_fetch_array() 函式以取得範例。

備註:

如果查詢返回大量的資料列,使用像 oci_fetch_array() 這樣的單列擷取函式可以更有效地利用記憶體。

備註:

對於返回大量資料列的查詢,可以透過增加 oci8.default_prefetch 或使用 oci_set_prefetch() 函式來顯著提升效能。

備註:

不會返回 Oracle Database 12c 隱式結果集中的資料列。請改用 oci_fetch_array() 函式。

參見

新增註解

使用者貢獻的註解 2 則註解

david at boeke dot com
20 年前
Skip 和 MaxRows 參數直到 4.2.1 版才被加入。
先前版本的 PHP 使用以下語法

int ocifetchstatement ( resource stmt, array &output)

此函式還有一個未記載的第三個參數。(我假設它是一個旗標)
eustaquiorangel at gmail dot com
10 年前
請注意,如果使用 OCI_NUM,則只會返回數字索引的結果。
OCI_NUM
To Top