Jak skompilować nieskompilowane obiekty?


W Oracle nieprzebraną skarbnicą wiedzy są widoki słownikowe. W widokach tych możemy znaleźć w zasadzie wszystkie informacje na temat naszej bazy danych- obiektów, struktury, kodu. Jak wykorzystać tę wiedzę? Jak najlepiej oczywiście!

Przy przygotowywaniu skryptu do kompilacji obiektów możemy posłużyć się jednym z nich.

DBA_OBJECTS / ALL_OBJECTS / USER OBJECTS

Widoki te zawierają informację, o wszystkich obiektach bazodanowych, tak procedurach i funkcjach jak też znaleźć możemy informacje o triggerach czy synonimach.

A co więcej każdy obiekt w tabeli ma określony STATUS - VALID/INVALID informujący o tym, czy obiekt jest poprwanie skompilowany czy nie. A dokładnie tego potrzebujemy!

Wyszukajmy zatem wszystkie nieskompilowane procedury, funkcje i pakiety:

 select object_name, status   
 from user_objects  
 where status = 'INVALID'  
 and object_type in ('PROCEDURE', 'FUNCTION', 'PACKAGE');  

Mając już te informacje zbudujemy sobie polecenie ALTER umożliwiające skompilowanie obiektów.
 select  
   'ALTER ' || OBJECT_TYPE || ' ' ||  
   OWNER || '.' || OBJECT_NAME || ' COMPILE;'  
 from  
  all_objects  
 where  
   status = 'INVALID'  
 and  
   object_type in ('PACKAGE','FUNCTION','PROCEDURE');  

I voila!
Teraz wystarczy skopiować i uruchomić wygenerowane altery i poczekać aż baza zrobi swoje!

Dla chętnych jest też druga metoda kompilacji obiektów, a w zasadzie całego schematu. W tym celu możemy wykorzystać pakiet DBMS_UTILITY.COMPILE_SCHEMA

Za pomocą tego pakietu możemy skompilować wskazany schemat i wszystkie jego obiekty lub też skompilować tylko nieskompilowane obiekty.

 begin  
 DBMS_UTILITY.COMPILE_SCHEMA (  
   schema    =>  'SCOTT',  
   compile_all  => false,  
   reuse_settings => FALSE);  
 end;  
 /  

Parametry:
SCHEMA
nazwa schematu, który chcemy skompilować

COMPILE_ALL
true - gdy chcemy skompilować wszystkie obiekty
false - gdy chcemy skompilować tylko obiekty w statusie INVALID

REUSE_SETTINGS
czy powinny być zastosowane parametry obiektu czy bieżącej sesji

W skryptach instalacyjnych czy innych automatycznych zadaniach korzystam najczęściej z pakietu dbms_utility do kompilacji obiektów. Jednak gdy taka kompilacja ma być przeprowadzona ręcznie bo coś gdzieś na jakimś środowisku się rozkompilowało - wolę korzystać z wygenerowanych poleceń ALTER. Przy okazji mam możliwość zerknięcia, co się nie skompilowało i podjęcia decyzji, czy faktycznie kompilować czy jednak wymagana jest jakaś dodatkowa weryfikacja błędów.

Także do wyboru do koloru a także w zależności od okoliczności można wybrać narzędzie odpowiednie do zadania. 

Komentarze