封闭游标 - SQL最佳实践

时间:2009-10-02 08:14:21

标签: sql oracle jdbc

我在一个大型的独立开发团队工作。我目前正在开发的项目有一个Oracle数据库团队,负责开发我们的J2EE Web层与之对话的存储过程和其他相关组件。

从开发中产生的一件事是当找不到结果时闭合光标的概念。

根据我的经验,封闭游标表示特殊情况;编程错误,不一定与数据相关。在当前上下文中,当 empty 结果集/游标对我更有意义时,表示没有找到数据。

人们从他们的角度思考或体验过什么?从传统的角度来看,任何可以揭晓的Oracle SQL开发人员都应该是错的吗?

最佳做法?

干杯!

1 个答案:

答案 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>