我有这样一个包:
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位生产版)
有什么想法吗?我错过了什么?
答案 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修复(但计算仍然会导致有状态)。