Какие ситуации приводят к тому, что пакеты Oracle становятся недействительными? - PullRequest
8 голосов
/ 09 марта 2009

Сценарий, который создал этот вопрос:

У нас есть пакет, который является зависимостью другого пакета, иногда внесение изменений в «родительский» пакет приводит к тому, что зависимый пакет становится недействительным, но иногда это не так.

Это застало нас врасплох.

Было бы очень полезно просто понять, что вызывает аннулирование, чтобы я мог предсказать / спланировать это.

Ответы [ 6 ]

12 голосов
/ 09 марта 2009

Изменение любого объекта, на который опирается пакет (например, таблицы, представления, триггеры, другие пакеты), автоматически помечает пакет как недействительный. Как указано выше в Tuinstoel, Oracle достаточно умен, чтобы перекомпилировать пакет при первом его использовании.

Если вас это беспокоит, каждый раз, когда вы вносите изменения в схему (например, таблицы, представления, триггеры, процедуры), запускайте DBMS_UTILITY.compile_schema (или ваш администратор базы данных делает это). Это заставит скомпилировать все пакеты и даст вам знать, где или если есть ошибки, прежде чем вы найдете их сложным способом.

5 голосов
/ 08 июля 2009

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

   select *
   from dba_dependencies
   where name = 'YOUR_PACKAGE'
   and referenced_owner = 'ANYUSER' --- Comment this out if you are looking for yourself
   and owner = USER --- Or can be set to any user

Это покажет все зависимости. Для ваших объектов запросите user_dependencies.

3 голосов
/ 09 марта 2009

Я согласен с Томасом Джонсом-Лоу, однако есть еще пара вопросов, связанных с длинными сеансами и перекомпиляцией.

Если вы ссылаетесь на пакет в сеансе, и этот пакет (или зависимый пакет) перекомпилируется во время того же сеанса, вы получите ошибку оракула "ORA-06508: PL / SQL: не удалось найти вызываемый программный модуль"

Как только вы ссылаетесь на пакет в сеансе, вы, как правило, не можете изменить пакет, не аннулировав его для этого сеанса. Это особая проблема для сред разработки, где пакеты часто меняются, но также и для производственных сред, где вы хотите сделать небольшое исправление, не разрушая всю среду. Обратите внимание, что эта ошибка будет возникать, даже если в измененных пакетах ошибок нет.

3 голосов
/ 09 марта 2009

Кстати, если я полностью ошибаюсь в ситуации ... заранее извиняюсь

застигнуты врасплох?

Не уверен, каковы последствия этого ...

Что-то сломалось в производстве?

Что именно произошло?

Причина, по которой я спрашиваю, заключается в том, что понять последствия каждого возможного изменения гораздо сложнее, чем иметь дело с результатом. Почему недействительность стала проблемой? Я думаю, потому что вы получили ошибку "Существующее состояние пакета было отклонено" в вашем приложении. Это проблема REAL ?

Опять же, я подозреваю, что это так, и если так, давайте просто разберемся с этим, а не со списком изменений, который, как я добавил в комментарии, зависит от версии. (Например, 11g отслеживает зависимость до столбца таблицы, а не таблицы в целом).

Это может не показаться вам важной ошибкой , если вы не используете состояние пакета. Если бы вы были, это было бы важной ошибкой, и вы бы не удивились, так что я полагаю, что это не так.

Так как вы не являетесь, эту ошибку можно игнорировать. Поскольку вы можете спокойно проигнорировать его, вы можете закодировать свое клиентское приложение, чтобы проигнорировать эту ошибку и повторить ваш вызов, потому что, как отмечали другие, Oracle перекомпилирует ваш пакет для вас. Это стоящее упражнение. Потому что вместо того, чтобы знать все возможные вещи, о которых вам нужно беспокоиться, когда вы вносите изменения, а затем в аварийном исправлении вы забываете одно из них, ваше приложение просто справится с этим и будет двигаться дальше, без беспокойства.

2 голосов
/ 09 марта 2009

В дополнение к ответу Томаса Джонса-Лоу, если вы измените только пакет BODY, зависимый объект может быть не помечен как недействительный.

Однако, как только вы измените спецификацию пакета, это обязательно произойдет.

1 голос
/ 09 марта 2009

Если попытаться выполнить неверный пакет Oracle, Oracle попытается скомпилировать его. Только когда он останется недействительным после компиляции, Oracle выдаст исключение.

...