Я с тобой. Возврат пустого набора результатов имеет для меня самый смысл.
Все дело в разделении интересов. Поиск данных - это услуга. Принимая во внимание, что обработка исключений NO_DATA_FOUND принадлежит вызывающему приложению.
редактировать
Я ожидал бы найти cursor%NOTFOUND
в процедуре PL / SQL, которая обрабатывает указатель ссылки. Например, подпрограмма PAYROLL может использовать функцию в подсистеме SALES, которая возвращает указатель ссылки всех заказов, принятых продавцами (в данном отделе, за данный квартал, независимо от того, что).
Я ожидаю, что подпрограмма PAYROLL будет циклически перебирать возвращенный набор результатов и проверять на cursor%NOTFOUND
. Я не ожидал бы, что функция SALES сделает это и вернет пустой курсор, если нет подходящих продавцов. Помимо нарушения принципа наименьшего сюрприза, это также означает, что либо функция поиска выполняет больше работы (дважды открывая курсор ссылки), либо она возвращает неправильные результаты .
SQL> create function get_emps(dno number) return sys_refcursor is
2 rc sys_refcursor;
3 begin
4 open rc for select * from emp where deptno = dno;
5 return rc;
6 end;
7 /
Function created.
SQL> var rc refcursor
SQL>
SQL> exec :rc := get_emps(10)
PL/SQL procedure successfully completed.
SQL> print rc
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- ---------- ---- ---- ------
7782 BOEHMER MANAGER 7839 09-06-1981 2450 10
7839 SCHNEIDER PRESIDENT 17-11-1981 5000 10
7934 KISHORE CLERK 7782 23-01-1982 1300 10
SQL>
SQL> create or replace function get_emps(dno number) return sys_refcursor is
2 rc sys_refcursor;
3 lrow emp%rowtype;
4 begin
5 open rc for select * from emp where deptno = dno;
6 fetch rc into lrow;
7 if rc%notfound then
8 close rc;
9 end if;
10 return rc;
11 end;
12 /
Function created.
SQL> exec :rc := get_emps(15)
PL/SQL procedure successfully completed.
SQL> print rc
ERROR:
ORA-24338: statement handle not executed
SP2-0625: Error printing variable "rc"
SQL> exec :rc := get_emps(10)
PL/SQL procedure successfully completed.
SQL> print rc
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- ---------- ---- ---- ------
7839 SCHNEIDER PRESIDENT 17-11-1981 5000 10
7934 KISHORE CLERK 7782 23-01-1982 1300 10
SQL>