(в академических целях реализовано с помощью пакета "my_package")
Компилируем:
CREATE OR REPLACE PACKAGE my_package as
PROCEDURE recompile_invalid_objects;
END my_package;
CREATE OR REPLACE PACKAGE BODY my_package as
PROCEDURE recompile_invalid_objects IS
BEGIN
FOR stmt IN (
select
case
when object_type = 'PACKAGE BODY' then 'ALTER PACKAGE ' || owner || '.' || object_name || ' COMPILE BODY'
else 'ALTER ' || object_type || ' ' || owner || '.' || object_name || ' COMPILE'
end as txt
from dba_objects where status = 'INVALID' order by object_type, owner
) LOOP
BEGIN
EXECUTE IMMEDIATE stmt.txt;
COMMIT;
EXCEPTION WHEN OTHERS THEN
/* Сообщаем о любой ошибке и пропускаем итерацию */
DBMS_OUTPUT.put_line (TO_CHAR(SYSTIMESTAMP, 'DD.MM.YYYY HH24:MI:SS.FF3') || ',ERROR,' || stmt.txt);
DBMS_OUTPUT.put_line (SQLERRM);
CONTINUE;
END;
/* Если ошибок не было, то сообщаем об успешном выполнении */
DBMS_OUTPUT.put_line (TO_CHAR(SYSTIMESTAMP, 'DD.MM.YYYY HH24:MI:SS.FF3') || ',SUCCESS,' || stmt.txt);
END LOOP;
END;
END my_package;
Запускаем:
(предварительно "set serveroutput on")
BEGIN
my_package.recompile_invalid_objects;
END;
Комментариев нет:
Отправить комментарий