
Strona o szybkim czytaniu.
Kiedy jakiś podprogram jest kompilowany, w słowniku danych zapisywane są wszystkie obiekty, do których odwołuje się ten podprogram. Jest on od nich bezpośrednio zależny.
Obiekty w bazie mogą być od siebie również zależne pośrednio, tworząc pewnego rodzaju łańcuchy zależności. Status podprogramu jest zaznaczany jako INVALID, jeśli jakakolwiek operacja DDL jest wykonywana na obiekcie, od którego ten podprogram zależy bezpośrednio lub pośrednio.
Jeżeli użytkownik próbuje wykonać podprogram, który ma status INVALID (rozkompilował się), to Oracle podejmuje próbę jego kompilacji oraz, jeżeli jest to potrzebne, próbę kompilacji wszystkich obiektów, od których jest zależny wołany podprogram.
Jeżeli próba ta się powiedzie, to podprogram jest wykonywany bez informowania użytkownika o zaistniałym procesie. Jeżeli próba się nie powiedzie, to zgłaszany jest błąd.
W przypadku, gdy podprogram wywołuje procedurę zawartą w pakiecie, to jest on zależny tylko od specyfikacji, tzn. przekompilowanie ciała pakietu nie spowoduje zmiany statusu podprogramu.
Jeżeli zmieniany jest jakikolwiek obiekt w tej samej bazie danych, to inwalidacja obiektów od niego zależnych następuje natychmiast, ponieważ zależności są zapisane w słowniku systemowym.
W przypadku zależności pomiędzy wieloma bazami danych (za pośrednictwem db linku) zależności nie są nigdzie zapisane, a zatem muszą być sprawdzane w momencie wykonywania się podprogramu.
Istnieją dwie metody sprawdzania, czy zdalny obiekt był zmieniany:
Oparta na znaczniku czasu – w słowniku user_objects kolumna LAST_DDL_TIME zawiera czas ostatniej modyfikacji. Czasy te są porównywane dla obu obiektów, i jeśli istnieje taka konieczność, to obiekt zależny zostaje przekompilowany.
Oparta na sygnaturze – (od wersji 7.3) – przy stosowaniu tej metody na podstawie nagłówka obliczany jest pewien klucz. Jeżeli ten klucz się nie zmienił, to oznacza, że chociaż zdalna procedura mogła być zmieniana, to nie trzeba rekompilować zależnej od niej innej procedury. Aby była stosowana metoda oparta na sygnaturze, należy wstawić do pliku parametrów linię REMOTE_DEPENDENCIES_MODE = SIGNATURE.
Aby wykonać jakikolwiek podprogram potrzebne jest uprawnienie EXECUTE na tym podprogramie. Użytkownik wykonujący podprogram nie musi mieć praw do obiektów, do których odwołuje się podprogram. Podprogramy są wykonywane w kontekście danych i obiektów właściciela podprogramu.
Jeżeli w podprogramie występuje pełne odwołanie do obiektu (z nazwą schematu), to użytkownik, który wykonuje podprogram musi mieć również prawa do tego obiektu i to nadane bezpośrednio (nie przez rolę).
W Oracle 8i wprowadzono możliwość wykonywania się podprogramów zarówno w kontekście praw właściciela jak i użytkownika uruchamiającego podprogram.
CREATE OR REPLACE PROCEDURE procedura1 [lista_parametrów]
[AUTHID {CURRENT_USER | DEFINER}]
IS
...
Dostęp do obiektów jest określany przy kompilacji, a więc w kontekście praw właściciela, dlatego może pojawić się błąd podczas wykonywania poprawnie skompilowane j procedury, jeżeli będzie ona przeznaczona do wykonywania się w kontekście użytkownika wywołującego, który nie będzie miał odpowiednich przywilejów.
Procedury, funkcje i pakiety są przechowywane w systemowym słowniku danych w postaci kodu źródłowego i w postaci skompilowanej. Nie dotyczy to podprogramów lokalnych, które są przechowywane wraz z podprogramami, w których są zdefiniowane.
Informacja o podprogramach jest dostępna w wielu różnych widokach słownika systemowego.
user_objects
Przechowuje informację między innymi o podprogramach, oraz o tym, czy są skompilowane poprawnie, czy też muszą byś zrekompilowane.
user_source
Zawiera kod źródłowy podprogramów.
user_errors
Zawiera informacje o błędach, jakie wystąpiły podczas kompilacji podprogramu.
user_dependencies
Zawiera informacje o wszystkich zależnościach pomiędzy obiektami użytkownika, w tym również o podprogramach.