2011-10-27 14 views
10

Tak więc uruchomiłem procedurę PLSQL dobrze i kompilowałem bez żadnych błędów. Zrobiłem jedną zmianę do mojego postępowania i nadal kompiluje grzywny, ale teraz, kiedy go uruchomić, dostaję ten błąd:Istniejący stan pakietów został odrzucony.

ERROR at line 1: 
ORA-04068: existing state of packages has been discarded 
ORA-04061: existing state of package body "SCHEMA.XP_COVER_PAGEP" has been invalidated 
ORA-04065: not executed, altered or dropped package body "SCHEMA.XP_COVER_PAGEP" 
ORA-06508: PL/SQL: could not find program unit being called: "SCHEMA.XP_COVER_PAGEP" 
ORA-06512: at "SCHEMA.XP_ST_002180", line 141 
ORA-06512: at line 1 

Jakieś pomysły co to może być? Wprowadzona przeze mnie zmiana była tak nieistotna, że ​​wątpię, by mogła spowodować ten błąd. Z góry dziękuję za Twoją pomoc!

Odpowiedz

23

Gdy sesja korzysta z pakietu, sesja zachowuje pewien stan pakietu. Jeśli ten pakiet zostanie zrekompilowany następnym razem, gdy ta sama sesja odwoła się do pakietu, otrzymasz ten błąd.

Aby tego uniknąć, należy odłączyć każdą sesję, która mogła korzystać z pakietu, lub zlecić wykonanie sesji DBMS_SESSION.RESET_PACKAGE w celu zresetowania stanu pakietu.

+1

Dzięki darreljnz, rozwiązanie zadziałało dobrze dla mnie. Ale na początku nie rozumiałem, o co ci chodzi. Tak więc, zamierzam wyjaśnić nieco twoje rozwiązanie innym. Otwórz nowe okno testowe w pl/sql i wklej "Begin sys.dbms_session.reset_package; end;" i naciśnij klawisz F9, aby go uruchomić, a następnie wprowadź zmiany w pakiecie lub przekompiluj pakiet, a teraz nie otrzymamy żadnych błędów w naszych aplikacjach. –

+1

Najlepsze rozpoczęcie odpowiedzi na ten problem. Byłoby dobrze widzieć to nieco dalej, aby wyjaśnić podstawowy problem i dlaczego wystąpił błąd. –

+0

@YogeshJindal wygląda na to, że mówisz coś innego niż darrelinjz. Napisał, że musisz uruchomić RESET_PACKAGE na każdej sesji po zmianie pakietu, aby uniknąć błędu. – pauloya

4

Jeśli przekompilujesz specyfikację pakietu, wszystkie zależne obiekty są unieważniane. Obiektem zależnym jest dowolny widok, specyfikacja pakietu, treść pakietu, funkcja lub procedura odwołująca się do dowolnej deklaracji z przekompilowanej specyfikacji pakietu.

Ponadto, jak zauważyła darreljnz, sesje zazwyczaj zachowują odniesienia do stanu pakietów, do których mają dostęp, powodując, że ORA-04068: existing state of packages has been discarded następnym razem, gdy sesja spróbuje odwołać się do pakietu.

To ostatnie zachowanie jest bardzo ważne i powoduje konieczność napisania kodu w celu ponowienia operacji lub zamknięcia wszystkich aktywnych sesji po zainstalowaniu nowej wersji pakietu (skuteczne ponowne uruchomienie aplikacji/usługi). Dolna linia: Utrudnia to instalowanie poprawek.

3

Użyj pragma serially_reusable w tobie Pakiet i jego ciało.

+1

co on robi, dlaczego to rozwiązanie? proszę rozwinąć – TecHunter

Powiązane problemy