Возвращает массив, содержащий следующую строку результата запроса.
Каждый элемент массива соответствует одному полю из строки. Эта функция
обычно вызывается в цикле, пока она не вернет FALSE, который указывает
на отсутствие последующих строк.
Корректный идентификатор выражения OCI8, полученный из
oci_parse() и исполненный функцией oci_execute(), или идентификатор выражения
REF CURSOR.
mode
Необязательный второй параметр может состоять из любой комбинации следующих
констант:
oci_fetch_array() Modes
Константа
Описание
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() для результирующего массива, чтобы
проверить соответствие регистров символов для каждого запроса.
$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; */
$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; */
/* Перед выполнением создайте таблицу: CREATE TABLE mytab (id NUMBER, description CLOB); INSERT INTO mytab (id, description) values (1, 'A very long string'); COMMIT; */
// Так как '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; */
// Выведет только одну записаь "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" // }
// Устанавливаем формат даты для данного соединения. // Для повышения производительности вместо этого // используйте изменение формата в триггере или переменной окружения. $stid = oci_parse($conn, "ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'"); oci_execute($stid);
// Запрос, который необходимо выполнить $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);
Индексы ассоциативного массива необходимо приводить в верхний регистр
для стандартных полей Oracle, созданных с регистронезависимыми названиями.
Замечание:
Для запросов, возвращающих большое количество рядов,
производительность может быть значительно увеличена с помощью увеличения значения опции
oci8.default_prefetch или использования oci_set_prefetch().