Лично я бы избегал «перекомпилировать все» (в 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'
Не совсем - если вы не знаете, как это было скомпилировано. Вот вопрос: зачем вы его компилируете, если он действителен? –