Причина, по которой вы ничего не получаете, когда нет данных, заключается в том, что цикл не выполняется. Логически выражение For говорит «выполнить следующий цикл для каждой строки, возвращаемой в курсоре», но в курсоре нет строк, поэтому он никогда не выполняет цикл. Кроме того, структура фактически указывает на то, что вы ожидаете несколько для данного p_id. Если это не так, вы можете удалить курсор все вместе. Предполагая, что p_id является первичным ключом, у вас есть либо 0, либо 1 строка, поэтому:
create or replace function stock_info (p_id in number)
return text
is
lv_movie_info varchar2(100);
begin
select i.movie_title || ' is available: ' || i.movie_qty || ' on the shelf'
into lv_movie_info
from mm_movie i
where p_id = movie_id;
return lv_movie_info;
exceptions
when no_data_found
then return 'no data found';
end stock_info;
Конечно, если вы ожидаете больше, чем 1 строка, необходим курсор, но IF не так, как условие were гарантирует, что это правда. Тем не менее, с 0 строками цикл не будет выполнен, поэтому сообщение «данные не найдены» должно идти после «Завершить цикл».
Страховщик