oci_set_prefetch
(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_set_prefetch — Define o número de linhas a serem pré-buscadas pelas consultas
Descrição
A pré-busca é a maneira eficiente da Oracle de retornar mais de uma
linha de dados do banco de dados em cada solicitação de rede. Isso pode
resultar em melhor utilização da rede e da CPU. O buffer de
linhas é interno ao OCI8 e o comportamento das funções de busca
do OCI8 permanece inalterado, independentemente da contagem de pré-busca. Por
exemplo, oci_fetch_row() sempre retornará uma
linha. O buffer de pré-busca é por instrução e não é usado por
instruções reexecutadas ou por outras conexões.
Chame oci_set_prefetch() antes
de chamar oci_execute().
Uma meta de ajuste é definir o valor de pré-busca para um tamanho razoável
para a rede e o banco de dados manipularem. Para consultas que retornam um
número muito grande de linhas, a eficiência geral do sistema pode ser melhor se
as linhas forem recuperadas do banco de dados em vários blocos (ou seja, definir o
valor de pré-busca menor que o número de linhas). Isso permite que o
banco de dados manipule as instruções de outros usuários enquanto o script PHP está
processando o conjunto atual de linhas.
A pré-busca de consultas foi introduzida no Oracle 8i. REF CURSOR
A pré-busca de CURSOR REF foi introduzida no Oracle 11gR2 e ocorre quando o PHP é
vinculado às bibliotecas do cliente Oracle 11gR2 (ou posterior).
A pré-busca de cursor aninhado foi
introduzida no Oracle 11gR2 e requer que tanto as bibliotecas do cliente Oracle
quanto o banco de dados sejam da versão 11gR2 ou superior.
A pré-busca não é suportada quando consultas contêm colunas LONG ou LOB.
O valor da pré-busca é ignorado e buscas de linha única serão usadas
em todas as situações em que a pré-busca não for suportada.
Ao utilizar o Oracle Database 12c, o valor de pré-busca
definido pelo PHP pode ser substituído pelo arquivo de configuração oraaccess.xml
do cliente
da Oracle. Consulte
a documentação da Oracle para obter mais detalhes.
Parâmetros
statement
-
Um identificador de declaração OCI8
válida criada por oci_parse() e executada
por oci_execute() ou um identificador de declaração REF
CURSOR
.
rows
-
O número de linhas a serem pré-buscadas, >= 0
Valor Retornado
Retorna true
em caso de sucesso ou false
em caso de falha.
Exemplos
Exemplo #1 Alterando o valor de pré-busca padrão para uma consulta
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
$stid = oci_parse($conn, 'SELECT * FROM myverybigtable');
oci_set_prefetch($stid, 300); // Defina antes de chamar 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);
?>
Exemplo #2 Alterando a pré-busca padrão para uma busca de CURSOR REF
<?php
/*
Crie o procedimento armazenado PL/SQL como:
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);
// Altera a pré-busca antes de executar o cursor.
// A pré-busca do REF CURSOR funciona quando o PHP está vinculado a bibliotecas de cliente Oracle 11gR2 ou posterior
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);
?>
Se o PHP OCI8 buscar um CURSOR REF e, em seguida, passar o CURSOR REF de volta
para um segundo procedimento PL/SQL para processamento posterior,
defina a contagem de pré-busca do CURSOR REF como 0
para
evitar que linhas sejam "perdidas" do conjunto de resultados. O valor da pré-busca é
o número de linhas extras buscadas em cada solicitação interna do OCI8 para
o banco de dados, portanto, defini-lo como 0
significa apenas
buscar uma linha por vez.
Exemplo #3 Definindo o valor de pré-busca ao passar um CURSOR REF de volta para o Oracle
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/orcl');
// Obtém o CURSOR REF
$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);
// Exibe duas linhas, mas não pré-busca nenhuma linha extra, caso contrário
// essas linhas extras não seriam passadas de volta para 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);
// Passa o CURSOR REF para myproc_use_rc() para realizar mais processamento de dados
// com o 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);
?>