ORA-04068,仅具有规格常数(DB 11.2.0.4)

时间:2017-02-01 13:16:01

标签: database oracle plsql oracle11g constants

我有这样一个包:

create or replace PACKAGE pkg_state
AS
   gv_test constant varchar(50) := 'Test!';

   FUNCTION get_variable
   RETURN VARCHAR2;
END pkg_state;
/

create or replace PACKAGE BODY pkg_state
AS

   FUNCTION get_variable
   RETURN VARCHAR2
   AS
   BEGIN
      RETURN 'TRUE';
   END get_variable;

END pkg_state;
/

我的理解是,使用11.2.0.2常量不会更改包状态。 但是当我在另一个会话中更改包体时,我将得到04068错误。如果常量在Package Body中,则一切都按预期工作,但不符合规范中的常量。

(Oracle Database 11g企业版11.2.0.4.0版 - 64位生产版)

有什么想法吗?我错过了什么?

2 个答案:

答案 0 :(得分:2)

我不知道他们是否在11g数据库中解决了这个问题。 为了避免这种使用(我知道它忽略了这一点):

create or replace PACKAGE pkg_state
AS
   FUNCTION gv_test RETURN VARCHAR2;

   FUNCTION get_variable
   RETURN VARCHAR2;
END pkg_state;
/

create or replace PACKAGE BODY pkg_state
AS
   FUNCTION gv_test 
   RETURN VARCHAR2
   AS
   BEGIN
      RETURN 'Test!';
   END;

   FUNCTION get_variable
   RETURN VARCHAR2
   AS
   BEGIN
      RETURN 'TRUE';
   END get_variable;

END pkg_state;
/

答案 1 :(得分:1)

在Oracle论坛(https://community.oracle.com/message/14756602#14756602)中询问后,情况如下:

包只有一个VARCHAR常量的状态 - 不带数字或bool。 (例外:当初始化是计算时,它仍然是有状态的:  v_var常数:= 1 + 1; - statefull)。

这似乎可以用12c修复(但计算仍然会导致有状态)。