首页 > 解决方案 > 如果重新编译规范,是否必须重新编译主体

问题描述

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

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

其实我很困惑,当你需要重新编译时package body,因为我不是在每种情况下都编译它。

标签: databaseoracleoracle11goracle12c

解决方案


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>

哇!!!有用。


推荐阅读