Закрытые курсоры - Лучшая практика SQL - PullRequest
2 голосов
/ 02 октября 2009

Я работаю в большой отдельной команде разработчиков. В проекте, над которым я сейчас работаю, есть команда Oracle DB, которая разрабатывает хранимые процедуры и другие связанные компоненты, с которыми работает наш веб-уровень J2EE.

Одна вещь, которая возникает в процессе разработки, это концепция закрытого курсора, когда результаты не найдены.

Из моего опыта закрытые курсоры означают исключительное обстоятельство; ошибка программирования, которая не обязательно связана с данными. В текущем контексте это означает, что никакие данные не были найдены, когда пустой результирующий набор / курсор будет иметь для меня больший смысл.

Что люди думают или имеют опыт с их точки зрения? Любые разработчики Oracle SQL, которые могли бы пролить свет на то, могу ли я ошибаться с обычной точки зрения?

Лучшие практики?

Ура! * * 1013

1 Ответ

6 голосов
/ 02 октября 2009

Я с тобой. Возврат пустого набора результатов имеет для меня самый смысл.

Все дело в разделении интересов. Поиск данных - это услуга. Принимая во внимание, что обработка исключений 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...