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() 执行的每个查询调用一次。
statement
由 oci_parse() 创建并由 oci_execute() 执行的有效的 OCI8 语句标识符,或 REF CURSOR
语句标识符。
output
包含返回行的变量。
LOB 列作为字符串返回,其中 Oracle 支持转换。
有关如何获取数据和类型的更多信息,请参阅 oci_fetch_array()。
offset
获取结果时要丢弃的初始行数。默认值为 0,因此返回从第一行开始的行。
limit
要返回的行数。默认为 -1,表示从 offset
+ 1 开始返回所有行。
flags
参数 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 rows fetched<br>\n";
var_dump($res);
// var_dump 输出为:
// 2 rows fetched
// 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 rows fetched
// 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_fetch_all() 和 OCI_NUM
<?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 rows fetched
// 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 数据库 12c 隐式结果集中返回行。请改用 oci_fetch_array()。
Skip 和 MaxRows 参数直到 4.2.1 版才添加。
先前版本的 php 使用以下语法
int ocifetchstatement ( resource stmt, array &output)
该函数还带有一个未记录的第三个参数。(我假设它是一个标志)