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() 执行的每个查询调用一次。

参数

statement

有效的 OCI8 语句标识符,由 oci_parse() 创建并由 oci_execute() 执行,或 REF CURSOR 语句标识符。

output

包含返回行的变量。

LOB 列以字符串形式返回,其中 Oracle 支持转换。

有关如何获取数据和类型的更多信息,请参见 oci_fetch_array()

offset

获取结果时要丢弃的初始行数。默认值为 0,因此返回第一行及以后的行。

limit

要返回的行数。默认值为 -1,表示从 offset + 1 开始返回所有行。

flags

参数 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 行被获取<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);

// Output is:
// 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()

参见

添加注释

用户贡献的注释 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,则只会返回数字索引的结果。
To Top