ORA-00600: внутренний код ошибки при компиляции, возвращающий конвейерную функцию - PullRequest
1 голос
/ 30 января 2020

У меня есть спецификация пакета с кодом, показанным ниже

CURSOR my_cur   IS      
select ...;   

TYPE mytype IS TABLE OF my_cur%ROWTYPE;   

FUNCTION myfun       
RETURN mytype  PIPELINED; 

, когда я пытаюсь скомпилировать спецификацию пакета, я получаю следующую ошибку:

ORA- 00600 : внутренний код ошибки, аргументы: [psdms c. c: недопустимый тип порождения], [0x1ED93D3C10], [3], [], [], [], [], [], [ ], [], [], []

Интересно то, что тело пакета, содержащего эту функцию, прекрасно компилируется.

Я думал, что набор результатов может вызвать проблемы, но запрос в моем курсоре возвращает не более 1 строки

Ответы [ 2 ]

1 голос
/ 30 января 2020

Эта проблема может встречаться в пределах диапазона версий для БД.

Ошибка может возникнуть из-за компиляции конвейерной функции, возвращающей таблицу PL / SQL с my_cur%ROWTYPE, когда встречаются следующие ситуации:

  • курсор [или таблица] my_cur, на который ссылается my_cur%ROWTYPE, принадлежит схеме, отличной от функции
  • в другой схеме есть другая функция с тем же именем, что и ошибочная функция
  • this other function ссылается на тот же курсор [или таблицу], что и неисправная функция,
  • this other function либо находится в той же схеме, что и курсор [или таблица] или в другом.

Для временного решения подключитесь к sys [или system] и проверьте объекты с недопустимым статусом с помощью

SQL> SELECT owner,object_name,status
  FROM dba_objects
 WHERE status = 'INVALID'
   AND object_type = 'TYPE'
   AND object_name LIKE 'SYS_PLSQL_%' 

OWNER OBJECT_NAME          STATUS
----- -------------------- --------
USER1 SYS_PLSQL_12345_2_1  INVALID   

, а затем скомпилируйте возвращаемый тип

SQL> alter type USER1.SYS_PLSQL_12345_2_1 compile;
SQL> show error

может вернуть PLS-00201 для другого типа, такого как

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0 PL/SQL: Compilation unit analysis terminated
1/44 PLS-00201: identifier 'USER2.SYS_PLSQL_12346_7_1' must be declared 

, а затем предоставить привилегию исполнения владельцу недопустимого типа

SQL> grant execute on USER2.SYS_PLSQL_12346_7_1 to USER1;

, а затем перекомпилировать неверный тип

SQL> alter type USER1.SYS_PLSQL_12345_2_1 compile;
SQL> show error

и перепроверять объекты с недействительным статусом по вышеуказанному запросу, если не возвращает строки, соответствующий пакет можно безопасно скомпилировать

SQL> alter package USER1.mypackage compile;     

Ref. Do c ID 1185303.1 из Oracle Поддержка

0 голосов
/ 31 января 2020

Найдена проблема - в моем запросе курсора один из псевдонимов был зарезервированным ключевым словом. Использование escape-символов не мешало рассматривать его как зарезервированное ключевое слово. Интересно то, что запрос работал нормально сам по себе, но мешал функции компилировать

...