Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle11g:游标在过程中的生存期。我必须关闭打开的游标吗?_Oracle_Plsql_Oracle11g_Cursor - Fatal编程技术网

Oracle11g:游标在过程中的生存期。我必须关闭打开的游标吗?

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;

在Oracle11g中,当PL/SQL上下文结束函数/过程自动关闭打开的游标时。在许多例子中,为什么web用户打开和关闭光标

这是向后兼容性吗

REF游标呢?把他们也关起来

如果光标应该始终关闭,那么处理异常又如何呢?在
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不,在许多情况下,我们必须使用显式游标。这是胡说八道的回答。