如果重新编译规范,是否必须重新编译主体

is it mandatory to recompile body if you recompile specification

我在包规范中有一个变量。我每次都只修改那个变量。

我每次进行这些更改时都需要重新编译 body 吗?

实际上我很困惑,当你需要重新编译时package body,因为我并不是在所有情况下都编译它。

oracle 中的包在会话中是有状态的,因此如果您从 DB 更改包规范或正文并且该包在应用程序的某个会话中使用,您将收到包状态已被丢弃的错误。但如果当前未通过任何会话访问包,则这不是问题。

但是,如果你说的是改变包和包体需要重新编译? --> 那么答案是否定的

在此处查看小演示:

正在创建包规范或正文:

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>

在不改变body的情况下调用包的函数:

SQL> select p.f(2) from dual;

    P.F(2)
----------
       456

SQL>

哇哦!!!有效。