Oracle robi to, ponieważ rekompilacja pakietu PL/SQL unieważnia wszelkie używane zmienne sesji.
Niewiele możemy zrobić, aby tego uniknąć, z wyjątkiem stosowania dobrych praktyk wdrażania. Nie wprowadzaj zmian, gdy baza danych jest w użyciu, upewnij się, że wszystkie połączenia są prawidłowo odłączone itp. Łatwiej powiedzieć niż zrobić w dobie CI/CD, zerowych przestojów i innych ekscytujących innowacji.
Z tyłu szafki jest więc jedna rzecz:pragma serially_reusable;
. Ta instrukcja oznacza, że stan pakietu jest utrzymywany przez czas pojedynczego wywołania serwera . Na przykład, jeśli mamy blok PL/SQL, który wywołuje procedurę SR trzy razy, każda zmienna zmieniona przez tę procedurę będzie utrzymywać wartość w trzech wywołaniach. Ale następnym razem, gdy uruchomimy blok - w tej samej sesji - zmienne zostaną zresetowane do swoich wartości początkowych.
Istnieje kilka ograniczeń dotyczących wielokrotnego użytku szeregowego PL/SQL — na przykład nie można go używać w zapytaniach SQL. Ale wielką atrakcją z twojej perspektywy nie jest już więcej błędów ORA-04068 lub ORA-04061. Brak stanu sesji, nic do unieważnienia.
pragma serially_reusable
muszą być zadeklarowane na poziomie pakietu, w treści i specyfikacji. Musisz więc mieć pewność, że żadna z pakietów procedur nie musi utrzymywać stanu między wywołaniami serwera.