oci_fetch_array

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_fetch_arrayDevuelve la siguiente fila de una consulta como un array asociativo o numérico

Descripción

oci_fetch_array(resource$statement, int$mode = ?): array

Devuelve un array que contiene la siguiente fila del conjunto de resultados de una consulta. Cada entrada del array corresponde a una columna de la fila. Esta función se invoca normamente en un bucle hasta que devuelva false, indicando que no existen más filas.

Si statement se corresponde con un bloque de PL/SQL devuelto por Conjuntos de Resultados Implícitos de Oracle Database 12c, entonces las filas de todos los conjuntos se obtienen consecutivamente. Si statement es devuelto por oci_get_implicit_resultset(), solamente son devueltos los subconjuntos de filas para una consulta hija.

Para más detalles sobre cómo la extensión OCI8 realiza la correspondencia entre tipos de datos, véasen los tipos de datos admitidos por el controlador

Parámetros

statement

Un identificador de sentencia de OCI8 válido creado por oci_parse() y ejecutado por oci_execute(), o un identificador de sentencia de REF CURSOR.

También puede ser un identificador de sentencia devuelto por oci_get_implicit_resultset().

mode

Este segundo parámetro opcional puede ser cualquier combinación de las siguientes contantes:

Modos de oci_fetch_array()
ConstanteDescripción
OCI_BOTHDevuelve un array con índices tanto asociativos como numéricos. Es lo mismo que con OCI_ASSOC + OCI_NUM. Es el comportamiento predeterminado.
OCI_ASSOCDevuelve un array asociativo.
OCI_NUMDevuelve un array numérico.
OCI_RETURN_NULLSCrea elementos para campos null. Los valores de los elementos serán null de PHP.
OCI_RETURN_LOBSDevuelve el contenido de los LOB en lugar de los descriptores de los mismos.

El valor predeterminado de mode es OCI_BOTH.

Use el operador de adición "+" para especificar más de un modo a la vez.

Valores devueltos

Devuelve un array con los índices asociativos y/o numéricos. Si no existen más filas en statement, devolverá false.

Por omisión, las columnas LOB son devueltas como descriptores LOB.

Las columnas DATE son devueltas como string con el formato de fecha actual. El formato predeterminado se puede cambiar con las variables de entorno de Oracle, como NLS_LANG, o ejecutando previamente un comando ALTER SESSION SET NLS_DATE_FORMAT.

Los nombres de columna predeterminados de Oracle que no consideran mayúsculas/minúsculas tendrán claves de array en mayúsculas. Los nombres de columnas sensibles al uso de mayúsculas/minúsculas tendrán claves de array que usan el nombre exacto de la columna. Use var_dump() en el array resultante para verificar el uso apropiado de mayúsculas/minúsculas en cada consulta.

El nombre de la tabla no está incluído en el índice del array. Si la consulta contiene dos columnas diferentes con el mismo nombre, use OCI_NUM o añada un alias de columna a la consulta para asegurarse de la unicidad de los nombres (véase el ejemplo #7). De lo contrario, solamente será devuelta una columna mediante PHP.

Ejemplos

Ejemplo #1 oci_fetch_array() con 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)) != false) {
// Usar nombres de columna en mayúsculas para los índices del array asociativo
echo $row[0] . " y " . $row['DEPARTMENT_ID'] . " son lo mismo<br>\n";
echo
$row[1] . " y " . $row['DEPARTMENT_NAME'] . " son lo mismo<br>\n";
}

oci_free_statement($stid);
oci_close($conn);

?>

Ejemplo #2 oci_fetch_array() con 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 id, description FROM mytab');
oci_execute($stid);

while ((
$row = oci_fetch_array($stid, OCI_NUM)) != false) {
echo
$row[0] . "<br>\n";
echo
$row[1]->read(11) . "<br>\n"; // esto imprimirá los primeros 11 bytes de DESCRIPTION
}

// La salida es:
// 1
// Un string m

oci_free_statement($stid);
oci_close($conn);

?>

Ejemplo #3 oci_fetch_array() con OCI_ASSOC

<?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 id, description FROM mytab');
oci_execute($stid);

while ((
$row = oci_fetch_array($stid, OCI_ASSOC)) != false) {
echo
$row['ID'] . "<br>\n";
echo
$row['DESCRIPTION']->read(11) . "<br>\n"; // esto imprimirá los primeros 11 bytes de DESCRIPTION
}

// La salida es:
// 1
// Un string m

oci_free_statement($stid);
oci_close($conn);

?>

Ejemplo #4 oci_fetch_array() con 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)) != false) { // Ignorar los NULL
var_dump($row);
}



$stid = oci_parse($conn, 'SELECT 1, null FROM dual');
oci_execute($stid);
while ((
$row = oci_fetch_array ($stid, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { // Obtener los NULL
var_dump($row);
}



?>

Ejemplo #5 oci_fetch_array() con OCI_RETURN_LOBS

<?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 id, description FROM mytab');
oci_execute($stid);

while ((
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_LOBS)) != false) {
echo
$row['ID'] . "<br>\n";
echo
$row['DESCRIPTION'] . "<br>\n"; // contiene todo lo de DESCRIPTION

Ejemplo #6 oci_fetch_array() con nombres de columna sensibles al uso de mayúsculas/minúsculas

<?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 * from mytab');
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);

// Ya que 'Name' fue creado como columna sensible al uso de mayúsculas/minúsculas,
// se usa lo mismo para el índice del array. Sin embargo, debe usarse 'CITY' en
// mayúsculas para los índices de columna insensibles al uso de mayúsculas/minúsculas
print $row['Name'] . "<br>\n"; // imprime Chris
print $row['CITY'] . "<br>\n"; // imprime Melbourne

oci_free_statement($stid);
oci_close($conn);

?>

Ejemplo #7 oci_fetch_array() con columnas que tienen nombres duplicados

<?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 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);

// La salida únicamente contiene la entrada "NAME":
// array(1) {
// ["NAME"]=>
// string(9) "Australia"
// }

// En consultas con nombres de columnas repetidos use un alias de columna de SQL, como "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);

// La salida ahora contiene ambas columnas seleccionadas:
// array(2) {
// ["CTNM"]=>
// string(9) "Melbourne"
// ["NAME"]=>
// string(9) "Australia"
// }


oci_free_statement($stid);
oci_close($conn);

?>

Ejemplo #8 oci_fetch_array() con columnas DATE

<?php

$conn
= oci_connect('hr', 'welcome', 'localhost/XE');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// Establecer el formato de fecha para esta conexión.
// Por razones de rendimiento, considere cambiar el formato
// en un disparador o con variables de entorno en su lugar
$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"; // imprime 1997-06-14

oci_free_statement($stid);
oci_close($conn);

?>

Ejemplo #9 oci_fetch_array() con REF CURSOR

<?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, 'BEGIN myproc(:rc); END;');
$refcur = oci_new_cursor($conn);
oci_bind_by_name($stid, ':rc', $refcur, -1, OCI_B_CURSOR);
oci_execute($stid);

// Ejecutar el REF CURSOR devuelto y obtenerlo como un identificador de sentencia
oci_execute($refcur);
echo
"<table border='1'>\n";
while (
$row = oci_fetch_array($refcur, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
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);

?>

Ejemplo #10 Paginación con oci_fetch_array() usando una consulta como LIMIT

<?php

$conn
= oci_connect('hr', 'welcome', 'localhost/XE');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// Buscar la versión de la base de datos
preg_match('/Release ([0-9]+)\./', oci_server_version($conn), $matches);
$oracleversion = $matches[1];

// Esta es la consulta que se quiere "paginar"
$sql = 'SELECT city, postal_code FROM locations ORDER BY city';

if (
$oracleversion >= 12) {
// Usar la sintaxis de Oracle 12c de OFFSET / FETCH NEXT
$sql = $sql . ' OFFSET :offset ROWS FETCH NEXT :numrows ROWS ONLY';
} else {
// Versiones antiguas de Oracle necesitaban una consulta anidada para

Ejemplo #11 oci_fetch_array() con Conjuntos de Resultados Implícitos de Oracle Database 12c

<?php

$conn
= oci_connect('hr', 'welcome', 'localhost/pdborcl');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// Requiere OCI8 2.0 y Oracle Database 12c
// Véase también oci_get_implicit_resultset()
$sql = 'DECLARE
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 FOR SELECT city, postal_code FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
OPEN c1 FOR SELECT country_id FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
END;'
;

$stid = oci_parse($conn, $sql);
oci_execute($stid);

// Nota: oci_fetch_all y oci_fetch() no se pueden usar de esta manera
echo "<table>\n";
while ((
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo
"<tr>\n";
foreach (
$row as $item) {
echo
" <td>".($item!==null?htmlentities($item, ENT_QUOTES|ENT_SUBSTITUTE):"")."</td>\n";
}
echo
"</tr>\n";
}
echo
"</table>\n";

// La salida es:
// Beijing 190518
// Bern 3095
// Bombay 490231
// CN
// CH
// IN

oci_free_statement($stid);
oci_close($conn);

?>

Notas

Nota:

Los índices de arrays asociativos tienen que estar en mayúsculas para las columnas estándar de Oracle que fueron creadas con nombres insensibles al uso de mayúsculas/minúsculas.

Nota:

Para consultas que devuelven un gran número de filas, se puede mejorar el rendimiento significativamente incrementando oci8.default_prefetch o utilizando oci_set_prefetch().

Nota:

La función oci_fetch_array() es insignificativamente más lenta que oci_fetch_assoc() o oci_fetch_row(), pero es más flexible.

Ver también

  • oci_fetch() - Coloca la siguiente fila de una consulta en los búferes internos
  • oci_fetch_all() - Obtiene múltiples filas de una consulta y las ubica en un array bidimiensional
  • oci_fetch_assoc() - Devuelve la siguiente fila de una consulta como un array asociativo
  • oci_fetch_object() - Devuelve la siguiente fila de una consulta como un objeto
  • oci_fetch_row() - Devuelve la siguiente fila de una consulta como un array numérico
  • oci_set_prefetch() - Establece el número de filas a precargar mediante consultas
To Top