3

Oracle 11gでは、PL/SQLコンテキスト終了関数/プロシージャが開いているカーソルを自動的に閉じます。多くの例で、Webユーザーがカーソルを開いたり閉じたりするのはなぜですか?

これは下位互換性ですか?

REF-CURSORはどうですか?手順を残してそれらも閉じますか?

カーソルを常に閉じる必要がある場合は、例外の処理についてはどうでしょうか。ブロックでは、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;
4

1 に答える 1

1

あなたのスクリプトでは、カーソルが開いているかどうかをチェックしていて、すでに開いている場合は閉じており、再度開いているため、間違っています。カーソルがすでに開いている場合は、閉じないでください。そのまま使用してください。

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 

例外ブロックでもカーソルを閉じることができます。

于 2013-02-02T11:58:40.773 に答える