ORA-04043: object SYS_PLSQL_XXXXXXXX_XXX_X does not exist

В этой статье попытаюсь провести расследование на тему - почему появляется ошибка "ORA-04043: object SYS_PLSQL_XXXXXXXX_XXX_X does not exist" и как её решить.
Началось всё с попытки перекомпилировать  пакет. Вот полный текст ошибки:
ERROR at line 1:
ORA-04045: errors during recompilation/revalidation of 
TEST_SCHEMA.TEST_LIFE_PG 
ORA-04043: object SYS_PLSQL_56A267A9_133_1 does not exist

Проанализировав материал по ссылкам (см. Используемая литература), пришла к выводу, что пакет с функционалом PIPE требует внутренние типы Oracle вида
"SYS_PLSQL_XXXXXXXX_XXX_X" при условия, А ВОТ ЭТО САМОЕ ИНТЕРЕСНОЕ: если такой, полностью идентичный, объект существует в другой схеме базы данных.  Вопрос: зачем вообще ему эти объекты, и создаёт ли он их сам, если нет в другой схеме.
На данный момент пользуюсь временным решением - нахожу подобные объекты в других схемах БД, проверяю, что нет таких в целой схеме, и создаю их. После пересобираю пакет - успех.

Пример временного решения. В примере указаны объекты из текста ошибкой. Так как при компиляции пакета, возможно  требование нескольких объектов.
   BEGIN
        FOR r IN (SELECT UNIQUE name/*, type#*//*, S.OWNER#*/
                FROM sys.obj$ S
                    WHERE (name LIKE 'SYS_PLSQL_9C8D516C_%' ESCAPE '@'
                             OR name LIKE 'SYS_PLSQL_F638D40F_%' ESCAPE '@'
                             OR name LIKE 'SYS_PLSQL_AF8E5319_%' ESCAPE '@'
                             OR name LIKE 'SYS_PLSQL_4075FF3D_%' ESCAPE '@')
                             AND type# != 10
                             AND type# = 13
                             AND S.OWNER# <> 732 
                             AND S.NAME NOT IN (
                             SELECT UNIQUE name/*, type#*//*, S.OWNER#*/
                                 FROM sys.obj$ S
                                 WHERE (name LIKE 'SYS_PLSQL_9C8D516C_%' ESCAPE '@'
                                           OR name LIKE 'SYS_PLSQL_F638D40F_%' ESCAPE '@'
                                           OR name LIKE 'SYS_PLSQL_AF8E5319_%' ESCAPE '@'
                                           OR name LIKE 'SYS_PLSQL_4075FF3D_%' ESCAPE '@')
                                           AND type# != 10
                                           AND type# = 13
                                           AND S.OWNER# = 732
                                                      )
      LOOP
          DBMS_OUTPUT.put_line(r.name);
          EXECUTE IMMEDIATE
           'CREATE TYPE TEST_SCHEMA.' || r.name;
      END LOOP;
END;

Список используемой литературы:
http://www.dba-oracle.com/t_ora_04043.htm
https://twitter.com/WhenOthers
https://community.oracle.com/thread/1131277
http://flyhorse127.blogspot.ru/2007/04/oracle-bug-3744836-while-using-table.html
http://www.anysql.net/doc/bug10104.html
https://dmitrybobrovsky.ru/2012/10/04/kratkaya-instruktsiya-po-ustanovke-prom/

Комментарии

Популярные сообщения из этого блога

SQL SERVER. Автономные транзакции. Autonomous transaction.

SQL SERVER. Поиск символа CHAR(39) во всех таблицах.

SQL SERVER Broker Priority