Курсор не хранит результаты, это действительно указатель, позволяющий перебирать результаты (как показывает @Ted в действии). Если вы хотите сохранить результаты в своем блоке PL / SQL, вы можете использовать коллекцию , которую вы можете объявить как тип, соответствующий вашей таблице, чтобы быть близким к вашему однострочному запросу в тип записи; а затем массовый сбор в это:
declare
type t_tab is table of mytable%ROWTYPE;
v_tab t_tab;
v_c pls_integer := 0;
begin
select *
bulk collect into v_tab
from mytable
where col1='20190103';
for i in 1..v_tab.count loop
if v_tab(i).col2 = 'Y' then -- whatever you need to test
v_c := v_c + 1;
end if;
end loop;
dbms_output.put_line(v_c);
end;
/
Но если вы не делаете что-то еще как со строками, которые совпадают, так и со строками, которые не соответствуют вашему условию, вы можете просто добавить это как тест в основной запрос:
declare
type t_tab is table of mytable%ROWTYPE;
v_tab t_tab;
v_c pls_integer := 0;
begin
select *
bulk collect into v_tab
from mytable
where col1='20190103'
and col2='Y'; -- whatever you need to test
for i in 1..v_tab.count loop
v_c := v_c + 1;
end loop;
dbms_output.put_line(v_c);
end;
/
Если вы подсчитываете только соответствующие строки, вам не нужен курсор или коллекция, просто используйте функцию агрегирования:
declare
v_c pls_integer;
begin
select count(*)
into v_c
from mytable
where col1='20190103'
and col2='Y'; -- whatever you need to test
dbms_output.put_line(v_c);
end;
/
или не использовать PL / SQL вообще:
select count(*)
from mytable
where col1='20190103'
and col2='Y'; -- whatever you need to test
Кстати, ваше значение '20190103'
выглядит так, как будто вы храните дату в виде строки. Вам следует использовать правильный тип данных - сохранять даты как фактические даты. (И если столбец является датой, то вы полагаетесь на неявное преобразование, что тоже не очень хорошая идея ...)