+2

Paginação de Resultados em Oracle

criado por Diego H. Sávio em 11/09/2003 8:54pm
Como pouco se fala sobre Oracle com PHP e basicamente o trabalho que desenvolvo consiste nisso, estarei documentando aqui como criar uma paginação que funciona de uma forma similar às varias já existentes para MySQL e PostgreSQL.

Infelizmente o Oracle não possui suporte para a cláusula LIMIT do MySQL, e tive que lutar para implementar uma alternativa com sub-selects.

conecta.php:
<?php
function conecta()
{
    $usuario = 'Eu';
    $senha = 'MINHA_SENHA';
    // caso o Banco esteja em outro servidor utilize a string do local do Banco Ex.:
    $banco = 'LOCAL_DO_BANCO';
    OCILogon($usuario, $senha, $banco);
}
?>

Agora vamos fazer uma consulta dos dados existentes nesse banco de dados.

consulta.php:

<?php
include("conecta.php");
$pagina = $HTTP_GET_VARS['pagina'];
$maior = $HTTP_GET_VARS['maior'];

// faz a conexão com o banco de dados através do 'conecta.php' e da função 'conecta()'
$conexao = conecta();

$sql = "SELECT * FROM banco";
// cria um statement do meu sql, ou seja, passa o
// meu sql para o banco e não retorna nada por enquanto
$sql = OCIParse($conexao, $sql);

// executa esse sql e retorna seu valor para o PHP, para
// que possamos criar uma matriz com os resultados do sql
// devemos utilizar outra função
OCIExecute($sql, OCI_DEFAULT);

// cria resultados, identico ao mysql_fetch_array.
while (OCIFetch($sql)) {
$variavel = OCIResult($sql, 'CAMPO_TABELA');

// estou passando o nome $variavel ao campo da tabela que estou
// trazendo para o meu PHP utilizando o mysql, daríamos um nome de
// variável para o meu mysql_fetch_array, e dele faríamos um
// resultado para que pudessemos mostrar na tela, aqui podemos dar
// o valor do resultado diretamente dentro do meu loop
echo $variavel;
}
?>

Fizemos uma consulta simples e agora podemos paginar esse consulta utilizando algumas artimanhas do banco de dados. Abaixo é a versão necessária para realmente paginar os resultados do banco.

consulta.php:
<?php
include("conecta.php");
// caso $pagina não exista...
if (!$pagina) {
    $maior = 10; // estou pegando 10 posições no meu SQL
    $menor = 1;
    $pagina = 1;
} else {
    $maior = $maior + 10;
    $menor = $maior - 9;
}

$conexao = conecta();

$sql = "SELECT * FROM banco";


$sql = "SELECT * FROM (SELECT rownum AS numero, CAMPO_TABELA FROM ($sql) WHERE numero
	<= $maior ) where rownum >= $menor";

// nessa parte utilizamos um sub-select (select dentro 
// de select) não suportado no MySQL na versão 3.23

$sql = OCIParse($conexao, $sql);
OCIExecute($sql, OCI_DEFAULT);

$sql2 = "SELECT COUNT(*) as CONTADOR FROM banco";
$sql2 = OCIParse($conexao, $sql2);
OCIExecute($sql2, OCI_DEFAULT);

while (OCIFetch($sql2)) {
    $conta = OCIResult($sql2, 'CONTADOR');
}

while (OCIFetch($sql)) {
    $variavel = OCIResult($sql, 'CAMPO_TABELA');
    echo $variavel;
}

// agora vamos criar os links da paginação
for ($i = 0; $i < $conta; $i++) {
    $vai = $pagina +1;
    $vaimaior = $vai * 10;

    // quando a página for igual a variável $i então 
    // não imprimo o link somente o número da página
    if ($pagina == $i) {
        echo $vai;
    } else {
        echo "<a href='?pagina=$i&maior=$vaimaior'>$vai</a>";
    }
}
?>

Da mesma forma que o Microsoft SQL Server, o Oracle não tem suporte para a cláusula LIMIT, e precisamos utilizar artifícios do banco para que possamos além de não perder performance, manter todo o controle do processo de paginação, caso queiramos que nossa paginação seja de 20 em vinte apenas com a troca de algumas variáveis podemos fazê-lo.

Sei que é bem parecido com as paginações que já existem no site, mas quando precisei saber de um exemplo para Oracle, levei um bom tempo tendo que encontrar onde fazê-la, por isso estou compartilhando com vocês, e espero poder compartilhar mais coisas em breve.

Boa sorte,
Diego

Comentários:

Mostrando 1 - 10 de 20 comentários
Pq está dando tando erro como se não estivesse encontrando os comando do oracle, alguém sabe me ajudar?

Warning: ociparse() expects parameter 1 to be resource, null given in C:\Inetpub\wwwroot\TCC\gr037n2s2005\greice\consulta.php on line 12

Warning: ociexecute() expects parameter 1 to be resource, null given in C:\Inetpub\wwwroot\TCC\gr037n2s2005\greice\consulta.php on line 17

Warning: ocifetch() expects parameter 1 to be resource, null given in C:\Inetpub\wwwroot\TCC\gr037n2s2005\greice\consulta.php on line 20
06/04/2006 11:26am (~18 anos atrás)

Caros, só aproveitando, esse Script foi feito para Oracle 8 e PHP 4.x.

Hoje utilizamos na empresa Oracle 9 e PHP 5.x.

A Oracle vem melhorando e muito sua "ligação" com o PHP, a versão 5.x do PHP já tem uma integração muito melhor.

Ainda é necessária a utilização de artifícios para algumas funções.

O BD Oracle vem melhorando muito em Performance, não é um banco ainda utilizado e difundido para sistemas Web, mas será.

Hoje para quem gosta ou quer estudar, existe a versão Express, que é free e tem suporte a conexões "externas" a máquina, o que não ocorria em versões para testes, além de suportar 4 Gigas de Dados sem necessidade de uma versão "superior".

Qualquer coisas, estamos por aí.
28/03/2006 6:51am (~18 anos atrás)

Alex Monte disse:
Ta ele eh veloZ e tudo mas.. o ki faz ele ser melhor q os outros...

vale dizer q tem banco Oracle rodanod com mais d 120 mil insercoes por minuto...

isso basta nao sei o mysql eh bom +++ ta longe de suprir a necessidade d uma grande empresa tipo um banco...

tipo a vivo se nao me engano usa oracle pensa quantas mil pessoas estao ligando enviando mensagens nesse exato momento... isso tudo registrando no banco e tals e o banco nao pode parar entao eh isso :D q faz o oracle ser melhor robusto e ta sempre d pé
28/03/2006 6:38am (~18 anos atrás)

Rui Ribeiro disse:
tb tou com o mm problema! n consigo por a funcionar!
10/11/2005 1:54pm (~19 anos atrás)

pessoal instalei o apache e o php em uma estação com win2k o apache e o php estaum funcionando corretamente porem segui alguns scripts para conexção do php com o oracle mas naum funcionou li aqui q deveria instalar o cliente do oracle na estação mas isso tbem naum adiantou hu q devo fazer para fazer o php conversar com o oracle.

aproposito a versão do php he 7.5 e do Oracle he 8i

Desde já agradeço
09/03/2005 3:50pm (~20 anos atrás)

thiago disse:
pessoal, fiz uma pequena adaptacao no sql do Diego e deu certo... ta ae pra quem quiser...

SELECT *
FROM (SELECT ROWNUM as numlinha, codusuario, nome
FROM (SELECT *
FROM usuario
ORDER BY nome)
WHERE ROWNUM <= :superior)
WHERE numlinha >= :inferior;


renomeie o rownum do segundo sql pra num linha e usei no where do primeiro sql....
11/12/2003 8:13am (~21 anos atrás)

Databasejournal:
http://www.databasejournal.com

Artigo sobre o db Intersystems Caché um sistema além do relacional:
http://www.intersystems.com.br/downloads/WhitepaperIDC_portugues.pdf

Pagina da intersystems
http://www.intersystems.com.br
27/09/2003 4:47pm (~21 anos atrás)

Caro Christopher Moura,

Pelo que sei você deverá instalar a versão Client do Oracle para conseguir a conexão com o servidor...

Abraço
23/09/2003 9:32am (~21 anos atrás)

Pessoal, estou procurando informações sobre como configurar um banco de dados Oracle para trabalhar com PHP. Já tenho o servidor web configurado (Apache + PHP > Red Hat 9) e gostaria de saber quais "drivers" do Oracle devo instalar nessa máquina para efetuar a conexão no meu banco Oracle que está na rede?
17/09/2003 7:59am (~21 anos atrás)

Diogo Gomes disse:
Recentemente, li na INFO (on line) que o Oracle superou em velocidade o MySQL para operações web. Concordo que o MySQL é supri nossas principais necessidades no desenvolvimento, mas em uma operação mais robusta, o Oracle poderia proporcionar mais segurança e diferentes formas de manipulação de dados.
Soube de uma intranet em um hospital que trabalhou muito bem com PHP+Oracle...
16/09/2003 5:03pm (~21 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)