Contando a quantidade de registros de um cursor

[ad#texto]

Uma coisa que geralmente o pessoal reclama no PL/SQL é a falta de um comando que retorne o total de linhas retornadas em um cursor, sem a necessidade de realizar um FETCH, afinal lembrem-se, performance acima de tudo.

Embora a Oracle não tenha colocado nada diretamente a partir da versão 9i é possível utilizar o OVER() em conjunto com o COUNT() dentro do SELECT, fica bem simples e não é precisa utilizar a cláusula GROUP BY.

Veja um exemplo:

DECLARE

CURSOR teste IS
 SELECT 1 valor,count(1) over() valor2
 FROM minha_tabela;

 testerr  teste%rowtype;

BEGIN
 OPEN teste;
 fetch teste INTO testerr;

 dbms_output.put_line('Linhas: ' || testerr.valor2);
end;

Notaram que basta apenas buscar o valor do campo VALOR2 que o total de linhas que será retornado será resgatada, sem a necessidade de ficar iterando sobre o FETCH para então contar linha a linha.

Uma outra forma é este outro exemplo:

DECLARE
CURSOR teste IS
 SELECT 1 valor, last_value(rownum) over() valor2
 FROM minha_tabela;

 testerr  teste%rowtype;

BEGIN
 OPEN teste;
 fetch teste INTO testerr;

 dbms_output.put_line('Linhas: ' || testerr.valor2);
end;

Também é funcional como a primeira forma.

Petter Rafael

Desenvolvedor Web atua com as tecnologias Java e PHP apoiadas pelos bancos de dados Oracle e MySQL. Além dos ambientes de desenvolvimento acima possuiu amplo conhecimento em servidores Apache/Tomcat, Photoshop, Arte & Foto, Flash e mais uma dezena de ferramentas e tecnologias emergentes. Atualmente colabora com o Viablog escrevendo sobre programação e tecnologia.