4

プロシージャを作成しようとしていますが、エラーなしで作成されました。ただし、実行しようとすると、次のエラーが発生します。お知らせ下さい

SQL> begin
  2   Update_STUD_Fin ( '1011');
  3  end;
  4  /
begin
*
ERROR at line 1:
ORA-06511: PL/SQL: cursor already open
ORA-06512: at "ORAIN.UPDATE_STUD_FIN", line 3
ORA-06512: at "ORAIN.UPDATE_STUD_FIN", line 8
ORA-06512: at line 2

手順は

SQL> CREATE OR REPLACE PROCEDURE Update_STUD_Fin ( AIDY_CODE IN VARCHAR2 ) IS
  2    CURSOR PublicationC IS
  3      SELECT SGidm from SGB
  4       WHERE SGCODE_EFF ='201030';
  5  BEGIN
  6    OPEN PublicationC;
  7  
  8    FOR PublicationR IN PublicationC
  9    LOOP
 10      DBMS_OUTPUT.PUT_LINE( PublicationR.SGidm );
 11    END LOOP;
 12  
 13    close PublicationC;
 14   
 15  END;
 16  /

Procedure created.
4

4 に答える 4

11

カーソルを明示的に OPEN したり、暗黙的な FOR ループで使用したりすることはできません。暗黙的 (FOR ループ) または明示的 (OPEN/FETCH/CLOSE) のいずれかを選択します。

于 2010-12-30T17:20:12.750 に答える
7

FOR/IN/LOOP でカーソルを使用する場合、明示的に開く必要はありません。書くだけ:

SQL> CREATE OR REPLACE PROCEDURE Update_STUD_Fin ( AIDY_CODE IN VARCHAR2 ) IS
  2    CURSOR PublicationC IS
  3      SELECT SGidm from SGB
  4       WHERE SGCODE_EFF ='201030';
  5  BEGIN
  8    FOR PublicationR IN PublicationC
  9    LOOP
 10      DBMS_OUTPUT.PUT_LINE( PublicationR.SGidm );
 11    END LOOP;
 12  
 15  END;
 16  /
于 2010-12-30T17:21:21.070 に答える
0

6512 エラー メッセージは、エラーが発生した PL-SQL コードの行番号を示します。の前に別のメッセージがありませんか?

于 2010-12-31T13:45:38.587 に答える
0

ORA-06512 メッセージが表示され、その上に他のエラー メッセージが表示されない理由がわかりません。エラー メッセージ全体を貼り付けましたか?

ORA-06512 は、PL/SQL コードで例外が発生したときにスタック トレースを出力する場合にのみ使用されます。完全な例を次に示します。

1 行目のエラー:
ORA-01001: カーソルが無効です
ORA-06512: 「USER.SOME_PROCEDURE」の5行目
ORA-06512: 1行目

ここでの実際のエラーは ORA-01001 です。ORA-06512 には、エラーが発生した場所が示されているだけUSER.SOME_PROCEDUREです。無名 PL/SQL ブロックの 1 行目によって呼び出された の 5 行目です。

あなたのコードを見て、私はいくつかの問題を見つけることができます:

  • then を使用するFOR ... IN some_cursor LOOP ...場合は、明示的にカーソルを開いたり閉じたりしないでください。FORこれは、ループによって自動的に行われます。

  • また、開いていないカーソルを閉じようとしないでください。これを実行しようとすると、ORA-01001 'invalid cursor' エラー メッセージが表示されます。カーソルを開く前に確実に閉じるためにこれを入れたと思いますが、残念ながらそれはできません。

つまり、プロシージャからすべてのOPENandCLOSEステートメントを削除して、再試行する必要があります。

于 2010-12-31T13:48:13.663 に答える