gpt4 book ai didi

oracle - oracle什么时候不需要关闭游标?

转载 作者:行者123 更新时间:2023-12-03 23:15:47 32 4
gpt4 key购买 nike

我正在使用 TOAD 在 Oracle 10.2 中工作。

我有一个类似的脚本:

DECLARE

my_query VARCHAR2(500) := 'select C1, C2, C3 FROM MYSCHEMA.MYTABLE';

TYPE my_record_type IS RECORD
(
C1 MYTABLE.C1%TYPE,
C2 MYTABLE.C2%TYPE,
C3 MYTABLE.C3%TYPE
);

TYPE my_table_type IS TABLE OF my_record_type;
my_records my_table_type;

my_cursor SYS_REFCURSOR;
BEGIN
OPEN my_cursor FOR my_records;
FETCH my_cursor
BULK COLLECT INTO my_records
LIMIT 1000;

FOR indx IN 1 .. my_records.COUNT
LOOP

/* SOME CODE HERE*/
IF /* CONDITION */ THEN
EXIT;
END IF;
END LOOP;
CLOSE my_cursor;
END;

我已经读过,如果你 CLOSE一个已经关闭的游标,oracle 将引发 INVALID_CURSOR 异常。

我还读到,当您在 FOR LOOP 中使用 CURSOR 时,oracle 会在 LOOP 结束时显式关闭游标。所以理论上我不需要像我一样关闭光标,我应该得到一个异常(exception),我不是。

现在我需要在 LOOP 中添加一个条件,使其退出 LOOP。
我读到当您使用 EXIT 时,oracle 会隐式关闭 CURSORS在 FOR 循环内或在抛出异常时。

那么我应该明确关闭 CURSOR 吗?如果我这样做,并且 CURSOR 因为我调用 EXIT 而关闭,它是否应该抛出异常?

如果删除关闭游标的显式调用,是否会出现内存泄漏?

在这种情况下使用 CURSOR 的正确方法是什么?

最佳答案

您似乎将 for 循环中的游标与 for 循环中的游标混淆了。前者是你所说明的。后者看起来像这样:

DECLARE    
cursor my_cursor is select C1, C2, C3 FROM MYSCHEMA.MYTABLE;
BEGIN
FOR my_record in my_cursor LOOP
/* SOME CODE HERE*/
IF /* CONDITION */ THEN
EXIT;
END IF;
END LOOP;
CLOSE my_cursor;
END;

在这种情况下, close语句会抛出错误,因为游标被 for 隐式打开了。语句并在循环结束时隐式关闭。

总而言之,如果您有 open声明,你也应该有一个 close陈述。如果您隐式打开一个游标,您可以相信它会被隐式关闭。

关于oracle - oracle什么时候不需要关闭游标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28330884/

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