2010-09-29 3 views
2

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

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

+6

Не совсем - если вы не знаете, как это было скомпилировано. Вот вопрос: зачем вы его компилируете, если он действителен? –

ответ

2

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

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

3

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

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

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

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

2

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

SQL>alter package <package name> compile body; 

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

SQL>show errors; 

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

В целом хорошо перекомпилировать упакованные пакеты. Не должно быть проблемой.

3

Лично я бы избегал «перекомпилировать все» (в 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 (DBMS_MAIL в Ора 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' 
+0

В: UTL_RECOMP.RECOMP_PARALLEL (threads => 4, schema =>: schema_owner), как вы можете ограничить только недействительным. –

+0

UTL_RECOMP работает только с объектами INVALID - это главное отличие от DBMS_UTILITY.COMPILE_SCHEMA. – JulesLt

Смежные вопросы