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

您不能显式地打开游标,也不能在隐式 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 仅说明错误发生的位置:在第 5USER.SOME_PROCEDURE行,由匿名 PL/SQL 块的第 1 行调用。

看看你的代码,我可以发现几个问题:

  • 使用FOR ... IN some_cursor LOOP ...then 时,您不应显式打开和关闭游标。这将由FOR循环自动为您完成。

  • 您也不应该尝试关闭尚未打开的游标。如果您尝试这样做,您将收到 ORA-01001 'invalid cursor' 错误消息。我猜您已将其放入以确保在打开光标之前将其关闭,但不幸的是您不能这样做。

简而言之,您应该从您的过程中删除所有的OPENandCLOSE语句,然后再试一次。

于 2010-12-31T13:48:13.663 回答