Вы можете просто передать аргумент процедуры в курсор, если хотите:
create or replace procedure getRec(nameToGet IN varchar2)
as
cursor get(nameToGet varchar2) is select * from test where name = nameToGet;
begin
for rec in get(nameToGet) loop
...
Может показаться, что это менее запутанно, если вы даете аргументам разные имена, например, имеете соглашение имен аргументов процедуры, начинающихся спрефикс 'p', аргументы курсора, начинающиеся с префикса 'c', или что-то еще.
И я убрал определение переменной rec
, потому что оно никогда не используется;rec
в for rec in ...
- это совершенно не связанная переменная.
Вся ваша логика dbms_output
находится внутри курсора для цикла, поэтому будет оцениваться только внутри цикла - т.е. при наличии данных.Если вы хотите использовать эту конструкцию цикла, вы можете использовать флаг, чтобы заметить, был ли вы вообще в цикле, что-то вроде:
create or replace procedure getRec(pNameToGet IN varchar2)
as
cursor get(cNameToGet varchar2) is
select * from test where name = cNameToGet;
lDataSeen boolean := false;
begin
for rec in get(pNameToGet) loop
lDataSeen := true;
dbms_output.put_line('Name : ' || ' ' || rec.name ||' ::: ' || 'Address : '
|| rec.address);
end loop;
if !lDataSeen then
dbms_output.put_line('No record found');
end if;
end;