Как получить количество записей в курсоре?
Xотел бы получить количество записей в курсоре. Есть ли ключевое слово, которое может помочь?
Используя это количество, необходимо построить логику при считывании записей.
Свободный перевод вопроса How to find number of rows in cursor от участника @Avi
Ответы (1 шт):
Нет, такого свойства или функции у курсора нет. В общем случае, неизвестно, сколько записей верннёт курсор.
Иногда предлaгаается решение, выполнить запрос дважды, один раз с COUNT, а второй раз для получения записей - неверно, так как между двумя запросами кол-во записей может изменится.
Атрибут курсора cursor_variable%rowcount возвращает кол-во записей, которые уже считаны во всех выполненых, включая текущий, FETCH, то есть с INTO (одиночное считывание) всегда плюс один:
В качестве решения, можно "вынудить" БД посчитать все записи в выборке оконной функцией COUNT:
declare
cursor cur is
select object_name, count(*) over () total from user_objects;
name varchar2(128);
total int;
begin
open cur;
fetch cur into name, total;
dbms_output.put_line ('rowcont='||cur%rowcount||' total '||total||' rows');
end;
rowcount=1 total 942 rows
Или, что самое простое, считать все записи в одном FETCH BULK COLLECT INTO. Конечно, это возможно только для сравнительно небольшого кол-ва записей, которые вернёт курсор:
declare
cursor cur is
select object_name from user_objects;
type rowarr is table of varchar2(128) index by pls_integer;
rows rowarr;
begin
open cur;
dbms_output.put_line ('rowcont='||cur%rowcount);
fetch cur bulk collect into rows;
dbms_output.put_line ('rowcount='||cur%rowcount||' total '||rows.count||' rows');
for i in 1..rows.count loop
null; /*здесь логика считывания*/ end loop;
end;
rowcount=942 total 942 rows