oci_set_prefetch
(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_set_prefetch — Indica el número de filas que deben leerse por adelantado por Oracle
Descripción
La pre-carga es una forma eficiente de devolver más de una fila de datos
desde la base de datos por cada envío de red. Esto permite una mejor utilización
de la red y del CPU. La pre-carga de filas es interna a OCI8 y el comportamiento
de las funciones de recuperación de datos permanece inalterado según el valor
del contador de pre-carga. Por ejemplo, la función oci_fetch_row()
siempre devolverá una fila. El buffer de pre-carga es específico de cada consulta
y no será utilizado para re-ejecutar consultas o por otras conexiones.
Es conveniente llamar a la función oci_set_prefetch() antes
de la función oci_execute().
Una forma de mejorar la eficiencia es definir el valor de pre-carga a un valor
razonable según la red y la base de datos a gestionar. Para las consultas que
devuelven un número muy grande de filas, es conveniente recuperar el conjunto
de filas por partes (es decir, definir el valor de pre-carga a un valor inferior
al número total de filas). Esto permite a la base de datos gestionar las consultas
de otros usuarios mientras el script PHP gestiona el conjunto de filas actual.
La pre-carga fue introducida en Oracle 8i.
La pre-carga REF CURSOR
fue introducida en
Oracle 11gR2 y está disponible cuando PHP está vinculado
con las bibliotecas clientes de Oracle 11gR2 (o superior).
Los cursores anidados de pre-carga fueron introducidos en Oracle
11gR2 y requieren tanto las bibliotecas clientes de Oracle,
como una base de datos en versión 11gR2 (o superior).
La pre-carga no es soportada cuando las consultas contienen columnas de tipo LONG o LOB. El valor de pre-carga será utilizado en todas las situaciones
donde la pre-carga es soportada.
Al utilizar la base de datos Oracle 12c,
el conjunto de valores pre-cargados por PHP puede ser sobrescrito por el archivo
de configuración cliente de Oracle oraaccess.xml
.
Consulte la documentación de Oracle para más detalles.
Parámetros
statement
-
Un identificador de consulta OCI8
creado por la función oci_parse() y ejecutado por la función
oci_execute(), o un identificador de consulta REF
CURSOR
.
rows
-
El número de filas a pre-cargar, >=0
Valores devueltos
Esta función retorna true
en caso de éxito o false
si ocurre un error.
Ejemplos
Ejemplo #1 Modificación del valor de pre-carga para una consulta
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
$stid = oci_parse($conn, 'SELECT * FROM myverybigtable');
oci_set_prefetch($stid, 300); // A definir antes de la llamada a la función 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);
?>
Ejemplo #2 Modificación del valor de pre-carga para una recuperación REF CURSOR
<?php
/*
Creación del procedimiento almacenado PL/SQL siguiente :
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);
// Modificación del valor de pre-carga antes de la ejecución del cursor.
// La pre-carga REF CURSOR funciona cuando PHP está vinculado con las bibliotecas clientes
// Oracle 11gR2 (o superior)
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 recupera datos desde un cursor REF CURSOR
y luego devuelve el cursor REF CURSOR
a un segundo
procedimiento almacenado para su procesamiento, entonces es conveniente definir
la pre-carga de REF CURSOR
a 0
para evitar perder filas del conjunto de resultados. El valor de pre-carga es
el número de filas adicionales a recuperar para cada llamada interna OCI8 a la base de datos,
por lo tanto, definirlo a 0
significa simplemente que se desea
recuperar una sola fila a la vez.
Ejemplo #3 Definición del valor de pre-carga al devolver un cursor REF CURSOR
a Oracle
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/orcl');
// Recuperación del cursor 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);
// Muestra 2 filas, pero no pre-carga filas adicionales
// de lo contrario, estas filas adicionales no serán pasadas a 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);
// pasa el cursor REF CURSOR a myproc_use_rc() para realizar otros
// procesamientos en el conjunto de resultados
$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);
?>