gpt4 book ai didi

sql - 关闭游标 - SQL 最佳实践

转载 作者:行者123 更新时间:2023-12-02 09:00:42 25 4
gpt4 key购买 nike

我在一个大型、独立的开发团队中工作。我目前正在从事的项目有一个 Oracle DB 团队,该团队开发存储过程以及与我们的 J2EE Web 层交互的其他相关组件。

开发中出现的一件事是当未找到结果时关闭游标的概念。

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

从他们的角度来看,人们的想法或经验是什么?这里有任何 Oracle SQL 开发人员可以阐明我是否从传统角度来看是错误的吗?

最佳实践?

干杯!

最佳答案

我和你在一起。返回空结果集对我来说最有意义。

这都是关于关注点分离的。数据检索是一项服务。而处理 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>

关于sql - 关闭游标 - SQL 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1508276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com