oci_fetch_array

(PHP 5, PECL OCI8 >= 1.1.0)

oci_fetch_arrayLit une ligne d'un résultat sous forme de tableau associatif ou numérique

Description

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

Retourne un tableau contenant la prochaine ligne d'une requête. Chaque entrée de ce tableau correspond à une colonne de la ligne. Cette fonction est appelée typiquement dans une boucle qui retourne FALSE lorsqu'il n'y a plus de ligne de disponible.

Pour plus de détails sur le mapping des types de données effectué par l'extension OCI8, lisez les types de données supportés par le driver.

Liste de paramètres

statement

Un identifiant de requête OCI8 créé par la fonction oci_parse() et exécuté par la fonction oci_execute(), ou un identifiant de requête REF CURSOR.

mode

Le paramètre optionnel mode peut être la combinaison des constantes suivantes :

Modes pour oci_fetch_array()
Constante Description
OCI_BOTH Retourne une tableau, indexé numériquement et avec les noms de colonnes. Identique à OCI_ASSOC + OCI_NUM). C'est le comportement par défaut.
OCI_ASSOC Retourne un tableau associatif.
OCI_NUM Retourne un tableau indexé numériquement.
OCI_RETURN_NULLS Crée des éléments vides pour les valeurs NULL. La valeur des éléments sera la valeur NULL PHP.
OCI_RETURN_LOBS Retourne le contenu du LOB au lieu de leur descripteur.

Le mode par défaut est OCI_BOTH.

Utilisez l'opérateur d'addition "+" pour spécifier plus d'un mode à la fois.

Valeurs de retour

Retourne un tableau avec des indices numériques ou associatifs. S'il n'y a plus de ligne de disponible pour la requête statement alors FALSE sera retourné.

Par défaut, les colonnes LOB sont retournées sous la forme de descripteurs LOB.

Les colonnes DATE sont retournées sous la forme d'une chaîne formatée avec le format de date courante. Le format par défaut peut être modifié grâce aux variables d'environnement Oracle, comme NLS_LANG ou par l'exécution de la commande ALTER SESSION SET NLS_DATE_FORMAT.

Les noms de colonnes qui ne sont pas sensibles à la casse (par défaut sous Oracle), auront des noms d'attributs en majuscule. Les noms de colonnes qui sont sensibles à la casse, auront des noms d'attributs utilisant exactement la même casse de la colonne. Utilisez la fonction var_dump() sur l'objet de résultat pour vérifier la casse appropriée à utiliser pour chaque requête.

Exemples

Exemple #1 Exemple avec oci_fetch_array() avec 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))) {
	// Utilisez des noms de colonne en majuscule pour les indices des tableau associatif
	echo $row[0] . " and " . $row['DEPARTMENT_ID']   . " are the same<br>\n";
	echo $row[1] . " and " . $row['DEPARTMENT_NAME'] . " are the same<br>\n";
}

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

?>

Exemple #2 Exemple avec oci_fetch_array() avec OCI_NUM

<?php

/*
  Avant l'exécution, créez la table :
	  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"; // ceci affichera les 11 premiers octets depuis DESCRIPTION
}

// Affiche :
//	1
//	A very long

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

?>

Exemple #3 Exemple avec oci_fetch_array() avec OCI_ASSOC

<?php

/*
  Avant l'exécution, créez la table :
	  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"; // ceci affichera les 11 premiers octets depuis DESCRIPTION
}

// Affiche :
//	1
//	A very long

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

?>

Exemple #4 Exemple avec oci_fetch_array() avec 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))) { // Ignore NULLs
	var_dump($row);
}

/*
Le code ci-dessus affiche :
  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))) { // Récupère NULLs
	var_dump($row);
}

/*
Le code ci-dessus affiche :
  array(2) {
	[1]=>
	string(1) "1"
	["NULL"]=>
	NULL
  }
*/

?>

Exemple #5 oci_fetch_array() with OCI_RETURN_LOBS

<?php

/*
  Avant l'exécution, créez la table :
	  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"; // contient la totalité de DESCRIPTION
}

// Affiche :
//	1
//	A very long string

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

?>

Exemple #6 Exemple avec oci_fetch_array() avec des noms de colonnes sensibles à la casse

<?php

/*
   Avant l'exécution, créez la table :
	  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);

// Vu que 'Name' a été créé comme une colonne sensible à la casse, la même casse
// est utilisé pour les index du tableau. Cependant, 'CITY' doit être utilisé
// pour les index de colonne non sensible à la casse
print $row['Name'] . "<br>\n";   //  affiche Chris
print $row['CITY'] . "<br>\n";   //  affiche Melbourne

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

?>

Exemple #7 Exemple avec oci_fetch_array() avec des colonnes possédant des noms dupliqués

<?php

/*
  Avant l'exécution, créez la table :
	  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);

// L'affiche ne contient que UNE entrée "NAME" :
//	array(1) {
//	  ["NAME"]=>
//	  string(9) "Australia"
//	}

// Pour interroger un nom de colonne dupliqué, utilisez un alias de colonne SQL
// comme "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);

// L'affichage contient maintenant 2 colonnes :
//	array(2) {
//	  ["CTNM"]=>
//	  string(9) "Melbourne"
//	  ["NAME"]=>
//	  string(9) "Australia"
//	}


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

?>

Exemple #8 Exemple avec oci_fetch_array() et des colonnes DATE

<?php

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

// Définit le format utilisé pour les dates sur cette connexion.
// Pour des raisons de performance, vous devriez modifier le format via un trigger ou
// en utilisant les variables d'environnement
$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";  // Affiche 1997-06-14

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

?>

Exemple #9 Exemple avec oci_fetch_array() et REF CURSOR

<?php
/*
  Créez la procédure stockée PL/SQL suivante avant l'exécution :

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

// Exécute le REF CURSOR retourné et y récupère un identifiant de requête
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);

?>

Exemple #10 Exemple avec oci_fetch_array() et un paramètre LIMIT

<?php

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

// This is the query you want to execute
$sql = 'SELECT city, postal_code FROM locations ORDER BY city';

// Cette requête imbriquée sélectionne une sous partie du jeu de lignes depuis $sql.
// En environnement de production, assurez-vous de vous protéger des injections SQL
// en concaténant les requêtes 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;  //commence à la première ligne
$num   = 5;  // retourne 5 lignes
$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";
}

// Affiche :
//	Beijing 190518x
//	Bern 3095x
//	Bombay 490231x
//	Geneva 1730x
//	Hiroshima 6823x

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

?>

Notes

Note:

Les indices des tableaux associatifs doivent être en majuscule pour les colonnes standards Oracle qui ont été créée avec des noms sensibles à la casse.

Note:

Pour les requêtes retournant un très grand nombre de lignes, les performances peuvent être très grandement accrues en augmentant la valeur de l'option oci8.default_prefetch ou en utilisant la fonction oci_set_prefetch().

Note:

La fonction oci_fetch_array() est significativement plus lente que la fonction oci_fetch_assoc() ou oci_fetch_row(), mais est plus flexible.

Voir aussi

  • oci_fetch() - Lit la prochaine ligne d'un résultat Oracle dans un buffer interne
  • oci_fetch_all() - Lit plusieurs lignes d'un résultat dans un tableau multi-dimensionnel
  • oci_fetch_assoc() - Lit une ligne d'un résultat sous forme de tableau associatif
  • oci_fetch_object() - Lit une ligne d'un résultat sous forme d'objet
  • oci_fetch_row() - Lit la prochaine ligne d'une requête sous forme de tableau numérique
  • oci_set_prefetch() - Indique le nombre de lignes qui doivent être lues à l'avance par Oracle

LoadingChargement en cours