(PHP 5, PECL OCI8 >= 1.1.0)
oci_fetch_array — Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива
$statement
[, int $mode
] )
Возвращает массив, содержащий следующую строку результата запроса.
Каждый элемент массива соответствует одному полю из строки. Эта функция
обычно вызывается в цикле, пока она не вернет FALSE
, который указывает
на отсутствие последующих строк.
За подробностями по операции отображения типов данных, осуществляемым расширением OCI8, обратитесь к типам данных, поддерживаемых драйвером
statement
Корректный идентификатор выражения OCI8, полученный из oci_parse() и исполненный функцией oci_execute(), или идентификатор выражения REF CURSOR.
mode
Необязательный второй параметр может состоять из любой комбинации следующих констант:
Константа | Описание |
---|---|
OCI_BOTH |
Возвращает массив как с ассоциативными и числовыми
индексами. Эта константа то же самое что и
OCI_ASSOC
+ OCI_NUM , и она используется по умолчанию. |
OCI_ASSOC |
Возвращает ассоциативный массив. |
OCI_NUM |
Возвращает нумерованный массив. |
OCI_RETURN_NULLS |
Создает элементы для полей равных NULL . Значение элемента
будет равно PHP NULL .
|
OCI_RETURN_LOBS |
Возвращает содержимое полей типа LOB, вместо LOB указателя. |
По умолчанию mode
равен OCI_BOTH
.
Используйте оператор сложения "+" для указания более одного режима.
Возвращает массив с ассоциативными и/или числовыми ключами. Если
больше нет строк в statement
, то возвращается
FALSE
.
По умолчанию, поля LOB возвращаются как указатели LOB.
Поля типа DATE возвращаются в формате строк, соответствующем текущему формату даты. Формат по умолчанию может быть изменен с помощью переменных окружения Oracle, таких как NLS_LANG, или предварительным выполнением комманды ALTER SESSION SET NLS_DATE_FORMAT.
Регистронезависимые (по умолчанию в Oracle) имена полей будут иметь ассоциативные индексы в верхнем регистре в результирующем массиве. Регистрозависимые имена полей будут иметь индексы с теми же регистрами символов, что и само поле. Используйте var_dump() для результирующего массива, чтобы проверить соответствие регистров символов для каждого запроса.
Пример #1 oci_fetch_array() с OCI_BOTH
<?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 department_id, department_name FROM departments');
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_BOTH))) {
// Используйте название полей в верхнем регистре для ассоциативных индексов
echo $row[0] . " и " . $row['DEPARTMENT_ID'] . " идентичны<br>\n";
echo $row[1] . " и " . $row['DEPARTMENT_NAME'] . " идентичны<br>\n";
}
oci_free_statement($stid);
oci_close($conn);
?>
Пример #2 oci_fetch_array() с OCI_NUM
<?php
/*
Перед выполнением создайте таблицу:
CREATE TABLE mytab (id NUMBER, description CLOB);
INSERT INTO mytab (id, description) values (1, 'A very long string');
COMMIT;
*/
$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 id, description FROM mytab');
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_NUM))) {
echo $row[0] . "<br>\n";
echo $row[1]->read(11) . "<br>\n"; // это выведет первые 11 байт DESCRIPTION
}
// Выведет:
// 1
// A very long
oci_free_statement($stid);
oci_close($conn);
?>
Пример #3 oci_fetch_array() с OCI_ASSOC
<?php
/*
Перед выполнением создайте таблицу:
CREATE TABLE mytab (id NUMBER, description CLOB);
INSERT INTO mytab (id, description) values (1, 'A very long string');
COMMIT;
*/
$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 id, description FROM mytab');
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_ASSOC))) {
echo $row['ID'] . "<br>\n";
echo $row['DESCRIPTION']->read(11) . "<br>\n"; // это выведет первые 11 байт DESCRIPTION
}
// Выведет:
// 1
// A very long
oci_free_statement($stid);
oci_close($conn);
?>
Пример #4 oci_fetch_array() с OCI_RETURN_NULLS
<?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 1, null FROM dual');
oci_execute($stid);
while (($row = oci_fetch_array ($stid, OCI_ASSOC))) { // Игнорирует NULL значения
var_dump($row);
}
/*
Вышеуказанный код выведет:
array(1) {
[1]=>
string(1) "1"
}
*/
$stid = oci_parse($conn, 'SELECT 1, null FROM dual');
oci_execute($stid);
while (($row = oci_fetch_array ($stid, OCI_ASSOC+OCI_RETURN_NULLS))) { // Получает NULL значения
var_dump($row);
}
/*
Вышеуказанный код выведет:
array(2) {
[1]=>
string(1) "1"
["NULL"]=>
NULL
}
*/
?>
Пример #5 oci_fetch_array() с OCI_RETURN_LOBS
<?php
/*
Перед выполнением создайте таблицу:
CREATE TABLE mytab (id NUMBER, description CLOB);
INSERT INTO mytab (id, description) values (1, 'A very long string');
COMMIT;
*/
$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 id, description FROM mytab');
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_LOBS))) {
echo $row['ID'] . "<br>\n";
echo $row['DESCRIPTION'] . "<br>\n"; // содержит весь DESCRIPTION
}
// Выведет:
// 1
// A very long string
oci_free_statement($stid);
oci_close($conn);
?>
Пример #6 oci_fetch_array() с регистрозависимыми названиями полей
<?php
/*
Перед выполнением создайте таблицу:
CREATE TABLE mytab ("Name" VARCHAR2(20), city VARCHAR2(20));
INSERT INTO mytab ("Name", city) values ('Chris', 'Melbourne');
COMMIT;
*/
$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 * from mytab');
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);
// Так как 'Name' было создан как регистрозависимое поле, то
// те же регисты символов используются для индексов массива.
// Тем не менее для 'CITY' должен использоваться индекс в верхнем регистре.
print $row['Name'] . "<br>\n"; // выведет Chris
print $row['CITY'] . "<br>\n"; // выведет Melbourne
oci_free_statement($stid);
oci_close($conn);
?>
Пример #7 oci_fetch_array() с полями с одинаковыми названиями
<?php
/*
Перед выполнением создайте таблицу:
CREATE TABLE mycity (id NUMBER, name VARCHAR2(20));
INSERT INTO mycity (id, name) values (1, 'Melbourne');
CREATE TABLE mycountry (id NUMBER, name VARCHAR2(20));
INSERT INTO mycountry (id, name) values (1, 'Australia');
COMMIT;
*/
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$sql = 'SELECT mycity.name, mycountry.name
FROM mycity, mycountry
WHERE mycity.id = mycountry.id';
$stid = oci_parse($conn, $sql);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC);
var_dump($row);
// Выведет только одну записаь "NAME":
// array(1) {
// ["NAME"]=>
// string(9) "Australia"
// }
// Для получения полей с повторяющимся названием используйте SQL псевдонимы (alias) для полей. Например "AS ctnm":
$sql = 'SELECT mycity.name AS ctnm, mycountry.name
FROM mycity, mycountry
WHERE mycity.id = mycountry.id';
$stid = oci_parse($conn, $sql);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC);
var_dump($row);
// Выведет записи из обоих полей:
// array(2) {
// ["CTNM"]=>
// string(9) "Melbourne"
// ["NAME"]=>
// string(9) "Australia"
// }
oci_free_statement($stid);
oci_close($conn);
?>
Пример #8 oci_fetch_array() с полями DATE
<?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, "ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'");
oci_execute($stid);
$stid = oci_parse($conn, 'SELECT hire_date FROM employees WHERE employee_id = 188');
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC);
echo $row['HIRE_DATE'] . "<br>\n"; // выведет 1997-06-14
oci_free_statement($stid);
oci_close($conn);
?>
Пример #9 oci_fetch_array() с REF CURSOR
<?php
/*
Создайте PL/SQL хранимую процедуру:
CREATE OR REPLACE PROCEDURE myproc(p1 OUT SYS_REFCURSOR) AS
BEGIN
OPEN p1 FOR SELECT * FROM all_objects WHERE ROWNUM < 5000;
END;
*/
$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, 'BEGIN myproc(:rc); END;');
$refcur = oci_new_cursor($conn);
oci_bind_by_name($stid, ':rc', $refcur, -1, OCI_B_CURSOR);
oci_execute($stid);
// Выполняет вовзращенный REF CURSOR и получает его в виде идентификатора выражения
oci_execute($refcur);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($refcur, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
oci_free_statement($refcur);
oci_free_statement($stid);
oci_close($conn);
?>
Пример #10 oci_fetch_array() с LIMIT-подобным запросом
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
// Запрос, который необходимо выполнить
$sql = 'SELECT city, postal_code FROM locations ORDER BY city';
// Этот вложенный выбирает часть строк из $sql.
// При реальной разработке будьте внимательны и избегайте
// возможности SQL-инъекции при объединении SQL выражений.
$limit_sql =
'select *
from ( select a.*, rownum as rnum
from (' . $sql . ') a
where rownum < :FIRST_ROW + :NUM_ROWS )
where rnum >= :FIRST_ROW';
$first = 1; // start with the first row
$num = 5; // return 5 rows
$stid = oci_parse($conn, $limit_sql);
oci_bind_by_name($stid, ':FIRST_ROW', $first);
oci_bind_by_name($stid, ':NUM_ROWS', $num);
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_ASSOC))) {
echo $row['CITY'] . " " . $row['POSTAL_CODE'] . "<br>\n";
}
// Выведет:
// Beijing 190518x
// Bern 3095x
// Bombay 490231x
// Geneva 1730x
// Hiroshima 6823x
oci_free_statement($stid);
oci_close($conn);
?>
Замечание:
Индексы ассоциативного массива необходимо приводить в верхний регистр для стандартных полей Oracle, созданных с регистронезависимыми названиями.
Замечание:
Для запросов, возвращающих большое количество рядов, производительность может быть значительно увеличена с помощью увеличения значения опции oci8.default_prefetch или использования oci_set_prefetch().
Замечание:
Функция oci_fetch_array() немного медленней oci_fetch_assoc() или oci_fetch_row(), но более гибкая.