Funciones de OCI8
PHP Manual

oci_fetch_array

(PHP 5, PECL OCI8 >= 1.1.0)

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

Descripción

array oci_fetch_array ( resource $statement [, int $mode ] )

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.

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.

mode

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

Modos de oci_fetch_array()
Constante Descripción
OCI_BOTH Devuelve un array con índices tanto asociativos como numéricos. Es lo mismo que con OCI_ASSOC + OCI_NUM y es el comportamiento predeterminado.
OCI_ASSOC Devuelve un array asociativo.
OCI_NUM Devuelve un array numérico.
OCI_RETURN_NULLS Crea elementos para campos NULL. Los valores de los elementos serán NULL de PHP.
OCI_RETURN_LOBS Devuelve el contenido de los LOBs 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, se devolverá FALSE.

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

Las columnas DATE son devueltas como cadenas con el formato de fecha en uso. 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 insensibles al uso de mayúsculas/minúsculas tendrán claves de array en mayúsculas. Los nombres de columnas sensibles al uso de mayúsculs/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.

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 ((
$fila oci_fetch_array($stidOCI_BOTH))) {
    
// Use nombres de columna en mayúsculas para los índices del array asociativo
    
echo $fila[0] . " and " $fila['DEPARTMENT_ID']   . " are the same<br>\n";
    echo 
$fila[1] . " and " $fila['DEPARTMENT_NAME'] . " are the same<br>\n";
}

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

?>

Ejemplo #2 oci_fetch_array() con OCI_NUM

<?php

/*
  Antes de ejecutarlo, cree la tabla:
      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 ((
$fila oci_fetch_array($stidOCI_NUM))) {
    echo 
$fila[0] . "<br>\n";
    echo 
$fila[1]->read(11) . "<br>\n"// esto imprimirá los primeros 11 bytes de DESCRIPTION
}

// La salida es:
//    1
//    A very long

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

?>

Ejemplo #3 oci_fetch_array() con OCI_ASSOC

<?php

/*
  Antes de ejecutarlo, cree la tabla:
      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 ((
$fila oci_fetch_array($stidOCI_ASSOC))) {
    echo 
$fila['ID'] . "<br>\n";
    echo 
$fila['DESCRIPTION']->read(11) . "<br>\n"// esto imprimirá los primeros 11 bytes de DESCRIPTION
}

// La salida es:
//    1
//    A very long

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 ((
$fila oci_fetch_array ($stidOCI_ASSOC))) { // Ignorar los NULLs
    
var_dump($fila);
}

/*
El código de arriba imprime:
  array(1) {
    [1]=>
    string(1) "1"
  }
*/

$stid oci_parse($conn'SELECT 1, null FROM dual');
oci_execute($stid);
while ((
$fila oci_fetch_array ($stidOCI_ASSOC+OCI_RETURN_NULLS))) { // Obtener los NULLs
    
var_dump($fila);
}

/*
El código de arriba imprime:
  array(2) {
    [1]=>
    string(1) "1"
    ["NULL"]=>
    NULL
  }
*/

?>

Ejemplo #5 oci_fetch_array() con OCI_RETURN_LOBS

<?php

/*
  Antes de ejecutarlo, cree la tabla:
      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 ((
$fila oci_fetch_array($stidOCI_ASSOC+OCI_RETURN_LOBS))) {
    echo 
$fila['ID'] . "<br>\n";
    echo 
$fila['DESCRIPTION'] . "<br>\n"// contiene todo de DESCRIPTION
}

// La salida es:
//    1
//    A very long string

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

?>

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

<?php

/*
  Antes de ejecutarlo, cree la tabla:
      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);
$fila oci_fetch_array($stidOCI_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 $fila['Name'] . "<br>\n";   //  imprime Chris
print $fila['CITY'] . "<br>\n";   //  imprime Melbourne

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

?>

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

<?php

/*
  Antes de ejecutarlo, cree la tabla:
      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);
$fila oci_fetch_array($stidOCI_ASSOC);
var_dump($fila);

// 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);
$fila oci_fetch_array($stidOCI_ASSOC);
var_dump($fila);

// 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);
$fila oci_fetch_array($stidOCI_ASSOC);
echo 
$fila['HIRE_DATE'] . "<br>\n";  // imprime 1997-06-14

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

?>

Ejemplo #9 oci_fetch_array() con REF CURSOR

<?php
/*
  Cree el procedimiento almacenado 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, -1OCI_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($refcurOCI_ASSOC+OCI_RETURN_NULLS)) {
    echo 
"<tr>\n";
    foreach (
$row as $item) {
        echo 
"    <td>".($item !== null htmlentities($itemENT_QUOTES) : "")."</td>\n";
    }
    echo 
"</tr>\n";
}
echo 
"</table>\n";

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

?>

Ejemplo #10 oci_fetch_array() con 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);
}

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

// Esta consulta anidada selecciona un subconjunto de filas de $sql.
// En entornos de producción, evite los problemas de inyecciones SQL
// con senetencias SQL concatenadas
$limit_sql 
   
'select *
    from ( select a.*, rownum as rnum
        from (' 
$sql ') a
        where rownum < :FIRST_ROW + :NUM_ROWS )
    where rnum >= :FIRST_ROW'
;

$first 1;  // empezar con la primera fila
$num   5;  // devolver cinco filas
$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($stidOCI_ASSOC))) {
    echo 
$row['CITY'] . " " $row['POSTAL_CODE'] . "<br>\n";
}

// La salida es:
//    Beijing 190518x
//    Bern 3095x
//    Bombay 490231x
//    Geneva 1730x
//    Hiroshima 6823x

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


Funciones de OCI8
PHP Manual