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.