PL / SQL Курсор уже открыт внутри функции? [Дубликат]

Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:

Вы пытаетесь использовать ссылочную переменную, значение которой Nothing / null. Если для ссылочной переменной значение Nothing / null, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.

Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную Nothing / null, или вы вызывали функцию, которая установите для этой переменной значение Nothing / null.

3
задан OMG Ponies 6 September 2011 в 04:02
поделиться

4 ответа

Вы не можете явно открыть курсор, а также использовать его в неявном цикле FOR. Вы выбираете либо неявный (цикл FOR), либо явный (OPEN / FETCH / CLOSE).

11
ответ дан Adam Hawkes 26 August 2018 в 22:34
поделиться

Если вы используете курсор с 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  /
7
ответ дан Codo 26 August 2018 в 22:34
поделиться

Я не знаю, почему вы получаете сообщение ORA-06512 без другого сообщения об ошибке над ним. Вы уверены, что вы ввели все сообщение об ошибке?

ORA-06512 используется только при печати трассировки стека при возникновении исключения в коде PL / SQL. Вот полный пример:

ERROR at line 1:
ORA-01001: invalid cursor
ORA-06512: at "USER.SOME_PROCEDURE", line 5
ORA-06512: at line 1

Настоящая ошибка здесь - ORA-01001. ORA-06512s просто указывают, где произошла ошибка: в строке 5 из USER.SOME_PROCEDURE, которая была вызвана по строке 1 анонимного блока PL / SQL.

Взглянув на ваш код, я могу заметить пара проблем:

  • При использовании FOR ... IN some_cursor LOOP ... вы не должны явно открывать и закрывать курсор. Это будет сделано для вас автоматически с помощью цикла FOR.
  • Вы также не должны пытаться закрыть курсор, который не был открыт. Если вы попытаетесь это сделать, вы получите сообщение об ошибке «неправильный курсор» ORA-01001. Я предполагаю, что вы включили это, чтобы убедиться, что курсор был закрыт, прежде чем вы его открыли, но, к сожалению, вы не можете этого сделать.

Короче говоря, вы должны удалить все OPEN и CLOSE из вашей процедуры и повторите попытку.

0
ответ дан Luke Woodward 26 August 2018 в 22:34
поделиться

6512 Сообщение об ошибке указывает номер строки в коде PL-SQL, в результате которой была получена ошибка. Вы уверены, что у вас нет другого сообщения раньше?

0
ответ дан Stef 26 August 2018 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: