пятница, 18 января 2013 г.

Невалидные/инвалидные/недействительные объекты Oracle (invalid_objects.sh)

В одном из отделений столкнулся с ситуацией, когда "Oracle Enterprise Manager" не работает, а компилировать недействительные объекты вручную трудоемко, поэтому решил задачу таким образом:
(в академических целях реализовано с помощью пакета "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;

Комментариев нет:

Архив