oci_set_prefetch
  (PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_set_prefetch — Indique le nombre de lignes qui doivent être lues à l'avance par Oracle
  
 
  Description
  
  
  
   Le préchargement est une façon efficace de retourner plus d'une ligne de données
   depuis la base de données pour chaque envoi réseau. Il en retourne une meilleure
   utilisation du réseau mais aussi une meilleure utilisation du CPU.
   Le préchargement de lignes est interne à OCI8 et le comportement des fonctions
   de récupération de données reste inchangé suivant la valeur du compteur de
   préchargement. Par exemple, la fonction oci_fetch_row() retournera
   toujours une ligne. Le buffer de préchargement est propre à chaque requête
   et ne sera pas utilisé pour ré-exécuter des requêtes ou par les autres connexions.
  
  
   Il convient d'appeler la fonction oci_set_prefetch() avant
   la fonction oci_execute().
  
  
   Un des moyens de gagner en efficacité est de définir la valeur de préchargement
   à une valeur raisonnable en fonction du réseau et de la base de données à gérer.
   Pour les requêtes retournant un très grand nombre de lignes, il convient
   de récupérer l'ensemble des lignes par morceaux (i.e. définit la valeur de
   préchargement à une valeur en dessous du nombre total de lignes). Ceci permet
   à la base de données de gérer les requêtes des autres utilisateurs pendant que le
   script PHP gère le jeu de lignes courant.
  
  
   Le préchargement a été introduit en Oracle 8i.
   Le préchargement REF CURSOR a été introduit en
   Oracle 11gR2 et est disponible lorsque PHP est lié
   avec les bibliothèques clientes Oracle 11gR2 (ou supérieur).
   Les curseurs imbriqués de préchargement ont été introduits en Oracle
   11gR2 et nécessitent à la fois les bibliothèques clientes
   Oracle, et une base de données en version 11gR2 (ou supérieur).
  
  
   Le préchargement n'est pas supporté lorsque les requêtes contiennent des colonnes
   de type LONG ou LOB. La valeur de préchargement sera utilisé dans toutes les situations
   où le préchargement est supporté.
  
  
   Lors de l'utilisation de la base de données Oracle 12c,
   le jeu de valeurs préchargées par PHP peut être écrasé par le fichier
   de configuration client d'Oracle oraaccess.xml.
   Référez-vous à la documentation d'Oracle pour plus de détails.
  
  
 
  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.
 
- rows
- 
      
       Le nombre de lignes à précharger, >=0
       
 
 
  Valeurs de retour
  
   Cette fonction retourne true en cas de succès ou false si une erreur survient.
  
  
 
  Exemples
  
   
    Exemple #1 Modification de la valeur de préchargement pour une requête
    
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
$stid = oci_parse($conn, 'SELECT * FROM myverybigtable');
oci_set_prefetch($stid, 300);  // A définir avant l'appel à la fonction oci_execute()
oci_execute($stid);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, 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($stid);
oci_close($conn);
?>
     
    
  
  
   
    Exemple #2 Modification de la valeur de préchargement pour une récupération REF CURSOR
    
<?php
/*
  Création de la procédure stockée PL/SQL suivante :
  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');
$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);
// Modification de la valeur de préchargement avant l'exécution du curseur.
// Le préchargement REF CURSOR fonctionne lorsque PHP est lié avec les bibliothèques clientes
// Oracle 11gR2 (ou supérieur)
oci_set_prefetch($refcur, 200);
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);
?>
     
    
  
  
   Si PHP OCI8 récupère des données depuis un curseur REF CURSOR
   puis, retourne le curseur REF CURSOR à une seconde
   procédure stockée pour traitement, alors il convient de définir le
   préchargement de REF CURSOR à 0
   afin d'éviter de perdre des lignes du jeu de résultats. La valeur de
   préchargement est le nombre de lignes supplémentaire à récupérer
   pour chaque requête interne OCI8 à la base de données, aussi, le fait de la
   définir à 0 signifie uniquement que nous souhaitons
   récupérer une seule ligne à la fois.
   
    Exemple #3 Définition de la valeur de préchargement lorsque l'on retourne
     un curseur REF CURSOR à Oracle
    
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/orcl');
// Récupération du curseur REF CURSOR
$stid = oci_parse($conn, 'BEGIN myproc(:rc_out); END;');
$refcur = oci_new_cursor($conn);
oci_bind_by_name($stid, ':rc_out', $refcur, -1, OCI_B_CURSOR);
oci_execute($stid);
// Affiche 2 lignes, mais ne précharge pas de lignes supplémentaires
// sinon, ces lignes supplémentaires ne seront pas passées à myproc_use_rc().
oci_set_prefetch($refcur, 0);
oci_execute($refcur);
$row = oci_fetch_array($refcur);
var_dump($row);
$row = oci_fetch_array($refcur);
var_dump($row);
// passe le curseur REF CURSOR à myproc_use_rc() afin d'effectuer d'autres
// traitement sur le jeu de résultats
$stid = oci_parse($conn, 'begin myproc_use_rc(:rc_in); end;');
oci_bind_by_name($stid, ':rc_in', $refcur, -1, OCI_B_CURSOR);
oci_execute($stid);
?>