(PHP 5, PECL OCI8 >= 1.1.0)
oci_fetch_all — Lit plusieurs lignes d'un résultat dans un tableau multi-dimensionnel
$statement
, array &$output
[, int $skip
= 0
[, int $maxrows
= -1
[, int $flags
= OCI_FETCHSTATEMENT_BY_COLUMN
+ OCI_ASSOC
]]] )Lit toutes les lignes d'un résultat Oracle dans un tableau à 2 dimensions. Par défaut, toutes les lignes sont retournées.
Cette fonction peut être appelée une seule fois pour chaque requête exécutée via la fonction oci_execute().
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.
output
La variable qui va contenir les lignes retournées.
Les colonnes LOB sont retournées sous la forme d'une chaîne lorsqu'Oracle supporte la conversion.
Voir la fonction oci_fetch_array() pour plus d'informations sur la façon dont les données et leurs types sont récupérés.
skip
Nombre de lignes initiales à ignorer lors de la lecture du résultat. Par défaut, ce paramètre vaut 0, pour commencer la lecture à la première ligne.
maxrows
Nombre de lignes maximal à retourner. Par défaut, vaut -1, ce qui
signifie que toutes les lignes disponibles seront retournées
depuis le paramètre skip
+ 1.
flags
Le paramètre flags
indique la structure
du tableau mais aussi si des tableaux associatifs doivent
être utilisés.
Constante | Description |
---|---|
OCI_FETCHSTATEMENT_BY_ROW |
Le tableau retourné contiendra un seul sous tableau par lignes. |
OCI_FETCHSTATEMENT_BY_COLUMN |
Le tableau retourné contiendra un seul sous tableau par colonnes. C'est le comportement par défaut. |
Les tableaux peuvent être indexés par l'en-tête de colonne ou numériquement.
Constante | Description |
---|---|
OCI_NUM |
Des indexes numériques sont utilisés pour chaque tableau de colonnes. |
OCI_ASSOC |
Des indexes associatifs sont utilisés pour chaque tableau de colonnes. C'est le comportement par défaut. |
Utilisez l'opérateur d'addition "+" pour choisir une combinaison de structures de tableaux et de modes d'index.
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.
Les requêtes qui possèdent plus d'une colonne dont le nom est identique doivent utiliser des alias. Sinon, seulement une des colonnes apparaîtra dans le tableau associatif.
Retourne le nombre de lignes récupérées dans le paramètre output
qui peut être de 0 ou plus, ou FALSE
si une erreur survient.
Exemple #1 Exemple avec oci_fetch_all()
<?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 POSTAL_CODE, CITY FROM locations WHERE ROWNUM < 3');
oci_execute($stid);
$nrows = oci_fetch_all($stid, $res);
echo "$nrows rows fetched<br>\n";
var_dump($res);
// var_dump affichera :
// 2 rows fetched
// array(2) {
// ["POSTAL_CODE"]=>
// array(2) {
// [0]=>
// string(6) "00989x"
// [1]=>
// string(6) "10934x"
// }
// ["CITY"]=>
// array(2) {
// [0]=>
// string(4) "Roma"
// [1]=>
// string(6) "Venice"
// }
// }
// Affichage des résultats
echo "<table border='1'>\n";
foreach ($res as $col) {
echo "<tr>\n";
foreach ($col as $item) {
echo " <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
oci_free_statement($stid);
oci_close($conn);
?>
Exemple #2 Exemple avec oci_fetch_all() et OCI_FETCHSTATEMENT_BY_ROW
<?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 POSTAL_CODE, CITY FROM locations WHERE ROWNUM < 3');
oci_execute($stid);
$nrows = oci_fetch_all($stid, $res, null, null, OCI_FETCHSTATEMENT_BY_ROW);
echo "$nrows lignes récupérées<br>\n";
var_dump($res);
// Affiche :
// 2 lignes récupérées
// array(2) {
// [0]=>
// array(2) {
// ["POSTAL_CODE"]=>
// string(6) "00989x"
// ["CITY"]=>
// string(4) "Roma"
// }
// [1]=>
// array(2) {
// ["POSTAL_CODE"]=>
// string(6) "10934x"
// ["CITY"]=>
// string(6) "Venice"
// }
// }
oci_free_statement($stid);
oci_close($conn);
?>
Exemple #3 Exemple avec oci_fetch_all() et 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 POSTAL_CODE, CITY FROM locations WHERE ROWNUM < 3');
oci_execute($stid);
$nrows = oci_fetch_all($stid, $res, null, null, OCI_FETCHSTATEMENT_BY_ROW + OCI_NUM);
echo "$nrows lignes récupérées<br>\n";
var_dump($res);
// Affiche :
// 2 lignes récupérées
// array(2) {
// [0]=>
// array(2) {
// [0]=>
// string(6) "00989x"
// [1]=>
// string(4) "Roma"
// }
// [1]=>
// array(2) {
// [0]=>
// string(6) "10934x"
// [1]=>
// string(6) "Venice"
// }
// }
oci_free_statement($stid);
oci_close($conn);
?>
Note:
L'utilisation du paramètre
skip
est vraiment inefficace. Toutes les lignes à éviter sont comprises dans le jeu de résultats retourné par la base de données à PHP. Puis, elles sont écartées. Il est plus efficace d'utiliser une requête SQL pour restreindre le champ des lignes désirées. Voir la fonction oci_fetch_array() pour un exemple concrêt.
Note:
Les requêtes qui retournent un très grand nombre de lignes peuvent gagner en économie de mémoire lors de l'utilisation de fonctions récupérant une seule ligne, comme le fait la fonction oci_fetch_array().
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:
En PHP 5.0.0 et antérieure, vous devez utiliser la fonction ocifetchstatement() à la place. Le nom de l'ancienne fonction peut toujours être utilisé dans les versions courantes, malgré le fait qu'il est maintenant obsolète et que nous ne vous le recommandons pas.