gpt4 book ai didi

sql - 从 pl/sql 异常 block 关闭所有游标 'once'

转载 作者:行者123 更新时间:2023-12-05 00:19:35 27 4
gpt4 key购买 nike

有没有一种更简单的方法可以从 PL/SQL 程序 (Oracle 10G) 中关闭所有打开的游标。

我有一个程序可以生成许多异常。要正确退出,我需要检查是否有任何游标打开和关闭它们。这就是我要结束的那种情况。

Procedure test
is
--
---
Begin
--
--
Exception
when no_data_found then
if cursorA%isopen close
if cursorB%isopen close
if cursorC%isopen close
when invalid_date then
if cursorA%isopen close
if cursorB%isopen close
if cursorC%isopen close
when invalid_user then
if cursorA%isopen close
if cursorB%isopen close
if cursorC%isopen close
when others then
if cursorA%isopen close
if cursorB%isopen close
if cursorC%isopen close

End test;

显然上面的方法并不理想,尤其是在有很多异常(exception)条款的情况下。不是对每个异常 block 进行相同的检查,而是有一个关闭所有打开的游标的更快方法?注意:它只需要关闭当前运行的 pl/sql 程序打开的游标,因为可能还有其他也可以打开游标的 pl/sql 程序。

提前致谢

最佳答案

您确定首先需要使用显式游标语法而不是使用隐式游标吗?如果您使用隐式游标,Oracle 会自动打开和关闭它们。您可以在下面的 block 中声明内联或外联查询

DECLARE
CURSOR cursor_a
IS SELECT *
FROM emp;
BEGIN
FOR a IN cursor_a
LOOP
<<do something>>
END LOOP;

FOR b IN (SELECT *
FROM dept)
LOOP
<<do something else>>
END LOOP;
END;

无论哪种情况,Oracle 都会在您退出 block 时自动关闭游标。

如果您出于某种原因确实需要使用显式游标,并且假设您需要捕获多个不同的异常,因为您将以不同的方式处理这些异常,您可以创建一个嵌套 block 来关闭游标,并从每个异常中调用它处理程序

DECLARE
CURSOR cursor_a
IS SELECT *
FROM emp;
CURSOR cursor_b
IS SELECT *
FROM dept;
PROCEDURE close_open_cursors
AS
BEGIN
IF( cursor_a%isopen )
THEN
close cursor_a;
END IF;
IF( cursor_b%isopen )
THEN
close cursor_b;
END IF;
END;
BEGIN
OPEN cursor_a;
OPEN cursor_b;
RAISE no_data_found;
EXCEPTION
WHEN no_data_found
THEN
close_open_cursors;
<<do something meaningful>>
WHEN too_many_rows
THEN
close_open_cursors;
<<do something meaningful>>
WHEN others
THEN
close_open_cursors;
raise;
END;

关于sql - 从 pl/sql 异常 block 关闭所有游标 'once',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7998442/

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