我在一个大型的独立开发团队工作。我目前正在开发的项目有一个Oracle数据库团队,负责开发我们的J2EE Web层与之对话的存储过程和其他相关组件。
从开发中产生的一件事是当找不到结果时闭合光标的概念。
根据我的经验,封闭游标表示特殊情况;编程错误,不一定与数据相关。在当前上下文中,当 empty 结果集/游标对我更有意义时,表示没有找到数据。
人们从他们的角度思考或体验过什么?从传统的角度来看,任何可以揭晓的Oracle SQL开发人员都应该是错的吗?
最佳做法?
干杯!
答案 0 :(得分:6)
我和你在一起。返回空结果集对我来说最有意义。
关注的是分离问题。数据检索是一种服务。处理NO_DATA_FOUND异常属于调用应用程序。
修改强>
我希望在PL / SQL过程中找到cursor%NOTFOUND
处理引用游标。例如,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>