Ответ @Barbaros решает большую часть вашей проблемы, но может быть уточнен.
Оператор IF в l oop совершенно не нужен, так как он никогда не вернет True при выполнении. Если бы это было верно, оператор выхода, предшествующий ему, вышел бы из цикла; Таким образом, нет сообщений. Это избыточно; сделать тест, где результат уже известен. Вы можете изменить порядок и поставить выход после IF ... END IF. Но тогда сообщение «не найдено» всегда будет выдаваться. Вы можете использовать cur% rowcount после l oop, чтобы правильно сгенерировать сообщение. В dbms_output_put_line (fil.name, fil.calories) есть 2 ошибки.
- переменная fil.calories не существует. GramCalories не был выбран в оригинале (как указано) и не был добавлен в ревизию. Поэтому не является частью курсора и, следовательно, не является частью типа строки курсора.
- Требуется один строковый параметр, поскольку есть 2 параметра.
Принимая это во внимание, мы получаем:
create or replace procedure getdetails( c_name varchar2, calories number ) is
cursor cur is
select f.name, c.gramcalories
from category c
join filling f
on f.categoryid = c.categoryid
where c_name=f.name
and calories=gramcalories;
fil cur%rowtype;
begin
open cur;
loop
fetch cur into fil;
exit when (cur%notfound);
dbms_output.put_line(fil.name || ' ' || fil..gramcalories);
end loop;
if cur%rowcount = 0 then
dbms_output.put_line('Not Found');
end if;
close cur;
end getdetails;
/
Как вопрос стиля :
- Избегайте соглашения о присвоении имен CamelCase. Oracle всегда складывает имена объектов в верхний регистр . Таким образом, это просто затрудняет чтение Oracle сгенерированных ссылок. Вместо этого используйте слова, разделенные Underscore (_).
- В отличие от Barbaros, я не считаю использование имени процедуры (function, package, ...) на завершающем конце избыточным, а скорее закрытием, а не «конец, если». Да, это синтаксически необязательный, но необязательный не является избыточным. Я всегда использую этот вариант. Итак, разработайте свой стиль (с учетом институциональных / клиентских стандартов), но соблюдайте его.