www.ladogorski.com

ORACLE - kompilowanie obiektów

Przy każdej zmianie obiektu, usunięciu, lub dodaniu pól do tabeli, wszystkie obiekty zależne ulegają dekompilacji. Czy jest jakiś sposób na to by kompilować je za jednym zamachem?

Jest taka możliwość. Wystarczy stworzyć prostą procedurkę, która będzie kompilowała wszystkie zdekompilowane obiekty. Jak to zrobić?
Posłużymy się do tego systemową tablicą user_objects. Będą nas interesowały trzy kolumny: object_type (typ obiektu), object_name(nazwa obiektu), status (status obiektu - VALID/INVALID). Jak w takim razie wylistować nieskompilowane obiekty? Takim selectem:
select object_type, object_name, status from user_objects where status='INVALID';
/

Natomiast skompilować obiekty możemy poleceniem:
alter typ_obiektu nazwa_obiektu compile;
/

Na podstawie tych wiadomości możemy napisać prostą procedurkę opartą na kursorze, która będzie kompilowała wszystkie nieskompilowane obiekty:

CREATE OR REPLACE PROCEDURE kompiluj_wsio
IS
BEGIN
DECLARE
CURSOR c_decompiled IS
SELECT object_type, object_name FROM user_objects WHERE status='INVALID'
AND object_type IN ('FUNCTION', 'PROCEDURE', 'TRIGGER', 'VIEW')
ORDER BY object_type;
BEGIN
FOR r_decompiled IN c_decompiled LOOP
execute immediate 'alter '||r_decompiled.object_type||' '
||r_decompiled.object_name||' compile';
END LOOP;
END;
END;
/

Jak zauważyliśmy, ta procedura kompiluje nieskompilowane funkcje, procedury, triggery i widoki. Teraz by uruchomić tą procedurę wystarczy wydać polecenie:
execute kompiluj_wsio;

Proste? Jeśli coś dał ci ten artykuł, proszę, oceń go.
W razie pytań lub sugestii - pisz do mnie.