Użycie COUNT(*) jest OK, jeśli używasz rownum=1:
declare
l_cnt integer;
begin
select count(*)
into l_cnt
from x
where x.col_a = value_a
and x.col_b = value_b
and rownum = 1;
end;
To zawsze zwróci wiersz, więc nie ma potrzeby obsługi żadnego wyjątku NO_DATA_FOUND. Wartość l_cnt będzie wynosić 0 (brak wierszy) lub 1 (istnieje co najmniej 1 wiersz).