我在一个大型的独立开发团队工作.我目前正在开发的项目有一个Oracle DB团队,负责开发我们的J2EE Web层与之对话的存储过程和其他相关组件.
从开发中产生的一件事是当找不到结果时闭合光标的概念.
根据我的经验,封闭的游标表示特殊情况; 编程错误,不一定与数据相关.在当前上下文中,它表示当空结果集/游标对我更有意义时,没有找到任何数据.
人们从他们的角度思考或体验过什么?从传统的角度来看,任何可以揭晓的Oracle SQL开发人员都应该是错的吗?
最佳做法?
干杯!
我和你在一起.返回空结果集对我来说最有意义.
一切都与关注点分离有关.数据检索是一种服务.处理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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1210 次 |
| 最近记录: |