У меня есть одна переменная в спецификации пакета. Я изменяю эту переменную только каждый раз.
Нужно ли мне перекомпилировать body каждый раз, когда я делаю эти изменения?
На самом деле я смущен, когда нужно перекомпилировать package body, потому что я не компилирую его в каждом случае.
Пакеты в оракуле сохраняют состояние в сеансе, поэтому вы получите сообщение об ошибке состояния пакета было отброшено, если вы измените спецификацию пакета или тело из БД, и этот пакет используется в каком-то сеансе в вашем приложении. но это не проблема, если доступ к пакету в настоящее время не осуществляется через какой-либо из сеансов.
Но, если вы говорите об изменении пакета и тела пакета, необходимо перекомпилировать? --> Тогда ответ - нет.
См. небольшую демонстрацию здесь:
Создание спецификации или тела пакета:
SQL> create or replace package p
2 as
3 num number := 123;
4 function f(p_in number) return number;
5 end p;
6 /
Package created.
SQL>
SQL> create or replace package body p
2 as
3 function f(p_in number) return number is
4 begin
5 return num;
6 end f;
7 end p;
8 /
Package body created.
SQL>
Вызов функции пакета:
SQL> select p.f(2) from dual;
P.F(2)
----------
123
SQL>
Изменение спецификации пакета:
SQL> create or replace package p
2 as
3 num number := 456;
4 function f(p_in number) return number;
5 end p;
6 /
Package created.
SQL>
Вызов функции пакета без изменения тела:
SQL> select p.f(2) from dual;
P.F(2)
----------
456
SQL>
Ой!!! Оно работает.