Безопасна ли перекомпиляция пакетов Oracle? - PullRequest
2 голосов
/ 29 сентября 2010

Привет У нас есть стороннее приложение на базе Oracle, которое поставляется с предварительно скомпилированными двоичными (упакованными) пакетами.Но когда я компилирую их в Oracle SQL Developer (щелкните правой кнопкой мыши -> compile all), они становятся недействительными.

Перекомпилируется ли безопасная операция без побочных эффектов?

Ответы [ 4 ]

3 голосов
/ 30 сентября 2010

Лично я бы избегал «Перекомпилировать все» (в SQL Developer или TOAD) - особенно в любой среде, где у вас есть открытые подключения к базе данных от других пользователей или программного обеспечения.

В большинстве случаев вы, вероятно, просто хотите перекомпилировать недопустимые объекты.

Если вы используете Oracle 10 или выше, есть два встроенных пакета, которые будут делать это (хотя они могут быть недоступны для вашей роли без обращения к администратору базы данных).

UTL_RECOMP.RECOMP_PARALLEL(threads => 4, schema => :schema_owner)

DBMS_UTILITY.COMPILE_SCHEMA(schema => :schema_owner, compile_all => FALSE)

UTL_RECOMP - новый предпочтительный способ сделать это. DBMS_UTILITY существует в более ранних версиях Oracle, но всегда компилирует все - compile_all - это новый необязательный флаг, который позволяет нам указывать компилировать только недопустимые элементы.

Если у вас более ранняя версия, чем 10, я бы предложил развернуть вашу собственную недопустимую процедуру компиляции - я нашел полезным написать это как задание, которое можно отправить через DBMS_JOB, а затем отправить по электронной почте ход выполнения через DBMS_SMTP Ора 10).

Моя работа рекурсивно пытается скомпилировать объекты INVALID, где все зависимости VALID, используя следующий SQL, пока не произойдет изменений между итерациями.

SELECT  uo.object_name,uo.object_type
FROM    user_objects uo
WHERE   uo.status = 'INVALID'
MINUS   -- objects with invalid children
SELECT  uo.object_name,uo.object_type
FROM    user_objects uo,
    user_objects uo2,
    public_dependency pd
WHERE   uo.status = 'INVALID'
AND     uo.object_id =  pd.object_id
AND     pd.referenced_object_id =  uo2.object_id
AND       uo2.status = 'INVALID'
3 голосов
/ 30 сентября 2010

Основным побочным эффектом является то, что если вы компилируете пакет, от которого зависит другой пакет, вы рискуете сделать недействительным зависимый пакет для любых существующих сеансов - даже если компиляция не содержит ошибок.Это хорошо для приложений, где сессии являются недолговечными, но для приложений, где сессии являются долгоживущими, это проблема.Если вы используете пулы соединений в JDBC, кэшированные сеансы будут долгоживущими и, вероятно, станут недействительными.Вы должны очистить кэшированные сеансы, чтобы избежать ошибки.

Ошибка, которую вы ищете: «ORA-04068: существующее состояние пакетов было отклонено».

См. здесь для получения дополнительной информации.

В частности, в отношении SQL Developer - он плохо обрабатывает перекомпиляцию упакованных пакетов.Если вы собираетесь их перекомпилировать, попробуйте другой инструмент, например TOAD или PL / SQL Developer, или используйте команду «alter package» в командной строке SQL Plus.

2 голосов
/ 30 сентября 2010

Если ваши пакеты становятся недействительными, действительно ли они недействительны в том смысле, что они больше не будут работать?Попробуйте перекомпилировать недопустимое тело пакета, используя sqlplus.

SQL>alter package <package name> compile body;

Если вы получите сообщение «скомпилировано с ошибками»

SQL>show errors;

Это даст некоторую информацию об ошибке.

Вообще говоря, можно перекомпилировать упакованные пакеты.Не должно быть проблемой.

2 голосов
/ 29 сентября 2010

Большинство сторонних приложений советуют вам не редактировать / компилировать их объекты, если, конечно, их поддержка не говорит вам об этом.

Поскольку вы не знаете всех зависимых объектов, я бы посоветовал вам связаться сперед тем, как вносить изменения в свои объекты, сначала обратитесь в службу поддержки.Если это связанное приложение, простая перекомпиляция объектов oracle может сделать зависимые приложения / сервисы на других уровнях недействительными.

...