Oracle11g:游标在过程中的生存期。我必须关闭打开的游标吗?
在Oracle11g中,当PL/SQL上下文结束函数/过程自动关闭打开的游标时。在许多例子中,为什么web用户打开和关闭光标 这是向后兼容性吗 REF游标呢?把他们也关起来 如果光标应该始终关闭,那么处理异常又如何呢?在Oracle11g:游标在过程中的生存期。我必须关闭打开的游标吗?,oracle,plsql,oracle11g,cursor,Oracle,Plsql,Oracle11g,Cursor,在Oracle11g中,当PL/SQL上下文结束函数/过程自动关闭打开的游标时。在许多例子中,为什么web用户打开和关闭光标 这是向后兼容性吗 REF游标呢?把他们也关起来 如果光标应该始终关闭,那么处理异常又如何呢?在EXCEPTION块中,我是否必须检查所有游标ISOPEN,然后关闭它们 基本脚本演示了自动关闭功能: DECLARE PROCEDURE TEST IS CURSOR CUR_CLIENTS IS SELECT DUMMY CL_ID FROM DUAL;
EXCEPTION
块中,我是否必须检查所有游标ISOPEN
,然后关闭它们
基本脚本演示了自动关闭功能:
DECLARE
PROCEDURE TEST IS
CURSOR CUR_CLIENTS IS SELECT DUMMY CL_ID FROM DUAL;
TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE;
LT_CLIENTS RT_CLIENTS;
BEGIN
IF CUR_CLIENTS%ISOPEN THEN
DBMS_OUTPUT.PUT_LINE('CLOSING CURSOR');
CLOSE CUR_CLIENTS;
END IF;
OPEN CUR_CLIENTS;
LOOP
FETCH CUR_CLIENTS BULK COLLECT INTO LT_CLIENTS LIMIT 1000;
EXIT WHEN LT_CLIENTS.COUNT = 0;
FOR I IN 1..LT_CLIENTS.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(LT_CLIENTS(I).CL_ID);
END LOOP;
END LOOP;
END TEST;
BEGIN
DBMS_OUTPUT.PUT_LINE('--------------------');
TEST;
DBMS_OUTPUT.PUT_LINE('--------------------');
TEST;
DBMS_OUTPUT.PUT_LINE('--------------------');
TEST;
DBMS_OUTPUT.PUT_LINE('--------------------');
END;
在脚本中,您的操作是错误的,因为您正在检查光标是否打开,如果光标已打开,则关闭光标,然后再次重新打开。如果光标已打开,则不要关闭它,只需使用它即可 在plsql中, 在内部块中打开的游标显然没有被隐式关闭。如果它们已关闭,我就不会超过打开的游标的最大数量。
以我的经验:
SQL> DECLARE
2 CURSOR last99 IS SELECT * FROM dual;
3 BEGIN
4 DECLARE
5 CURSOR test01 IS SELECT * FROM dual;
6 CURSOR test02 IS SELECT * FROM dual;
7 CURSOR test03 IS SELECT * FROM dual;
............................
............................
51 CURSOR test47 IS SELECT * FROM dual;
52 CURSOR test48 IS SELECT * FROM dual;
53 BEGIN
54 OPEN test01;
55 OPEN test02;
56 OPEN test03;
..............
...............
99 OPEN test46;
100 OPEN test47;
101 OPEN test48;
102 END;
104 --This last OPEN will cause an error
105 --from too many cursors.
106 OPEN last99;
107 END;
108 /
DECLARE
*
ERROR at line 1:
ORA-01000: maximum open cursors exceeded
ORA-06512: at line 2
ORA-06512: at line 106
您也可以在异常块中关闭光标 始终关闭循环下方的光标,以避免过度使用流程,而不是因为它会影响最终结果…这只是一个好方法practice@Ark
良好实践
建议总是受欢迎的,所以meSo的+1您进行了测试,为什么不接受自动关闭的结果?只需使用隐式游标;它们运行得一样快或更快,并且更容易编码和理解。@jonearles不,在许多情况下,我们必须使用显式游标。这是胡说八道的回答。