С моей точки зрения, вы делаете это неправильно (независимо от ошибок, которые вы получили при компиляции функции). Зачем? Потому что кажется, что функция должна возвращать ровно одно значение. Если это так, почему вы используете курсор (и цикл)? Если есть две (или более) строки, которые удовлетворяют условию, вы вернете только последнее выбранное значение, так что ... в чем смысл?
Поэтому я бы предложил что-то вроде этого:
- выберите это единственное значение и верните результат
- если ничего не найдено, обработайте его правильно, используя раздел
EXCEPTION
- другими словами, не «скрывайте» тот факт, что ни одна строка не удовлетворяет условию внутри цикла курсора. Не ленись. Пусть кто-нибудь еще, кто будет поддерживать ваш код когда-нибудь, узнает, что происходит. Вы не пишете загадочную книгу, а функцию
Вот что я имел в виду. Сначала тестовый пример:
SQL> create table inscription
2 (codepermanent varchar2(10),
3 codesession int,
4 note number
5 );
Table created.
SQL> insert into inscription
2 select 'x', 1, 20 from dual union all
3 select 'y', 2, 99 from dual;
2 rows created.
Функция:
SQL> create or replace function bonneperformance
2 (codep in varchar2, codes in int)
3 return varchar2
4 is
5 estbon varchar2(10) := 'UNKNOWN';
6 begin
7 select case when note > 95 then 'TRUE'
8 else 'FALSE'
9 end
10 into estbon
11 from inscription
12 where codepermanent = codep
13 and codesession = codes;
14
15 return estbon;
16 exception
17 when no_data_found then
18 return estbon;
19 end;
20 /
Function created.
Тестирование:
SQL> select bonneperformance('x', 1) result from dual;
RESULT
--------------------
FALSE
SQL> select bonneperformance('y', 2) result from dual;
RESULT
--------------------
TRUE
SQL> select bonneperformance('z', 3) result from dual;
RESULT
--------------------
UNKNOWN
SQL>