Skip 和 MaxRows 參數直到 4.2.1 版才被加入。
先前版本的 PHP 使用以下語法
int ocifetchstatement ( resource stmt, array &output)
此函式還有一個未記載的第三個參數。(我假設它是一個旗標)
(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
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_FETCHSTATEMENT_BY_ROW |
外部陣列將針對每一個查詢列包含一個子陣列。 |
OCI_FETCHSTATEMENT_BY_COLUMN |
外部陣列將針對每一個查詢欄包含一個子陣列。這是預設值。 |
陣列可以透過欄標題或數字索引。只會返回一種索引模式。
常數 | 說明 |
---|---|
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_ROW
的 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, 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_NUM
的 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, 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() 函式。
Skip 和 MaxRows 參數直到 4.2.1 版才被加入。
先前版本的 PHP 使用以下語法
int ocifetchstatement ( resource stmt, array &output)
此函式還有一個未記載的第三個參數。(我假設它是一個旗標)