【问题标题】:CREATE Oracle Procedure创建 Oracle 过程
【发布时间】:2011-06-01 16:05:22
【问题描述】:

我正在尝试创建一个过程并且它创建时没有错误。但是,当我尝试运行它时,我会收到以下错误。请指教

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.

【问题讨论】:

标签: oracle stored-procedures plsql ora-06512


【解决方案1】:

您不能显式打开游标并在隐式 FOR 循环中使用它。您可以选择隐式(FOR 循环)或显式(OPEN/FETCH/CLOSE)。

【讨论】:

    【解决方案2】:

    如果您使用带有 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  /
    

    【讨论】:

    • 你也不需要close,确定吗?
    • 感谢您的提示。我已经修好了。
    【解决方案3】:

    6512 错误消息指示错误导致的 PL-SQL 代码中的行号。 你确定你之前没有其他消息吗?

    【讨论】:

      【解决方案4】:

      我不知道您为什么收到 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 的第 5 行,由匿名 PL/SQL 块的第 1 行调用。

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

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

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

      简而言之,您应该从您的过程中删除所有OPENCLOSE 语句,然后重试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-01
        • 2016-03-03
        • 2021-10-12
        • 2017-12-21
        • 2012-11-19
        • 1970-01-01
        相关资源
        最近更新 更多