PL / SQL Pragma错误地违反了

时间:2016-01-31 13:54:27

标签: oracle plsql oracle12c

我的包标题代码如下所示:

CREATE OR REPLACE PACKAGE INST_PKG IS
    ...
    FUNCTION Check_View (
        view_name_ IN VARCHAR2 ) RETURN BOOLEAN;
    PRAGMA restrict_references (Check_View, WNDS);
    ...
END INST_PKG;

函数的主体定义如下:

CREATE OR REPLACE PACKAGE BODY INST_PKG IS

    ....

    FUNCTION View_Exist (
        view_name_ IN VARCHAR2 ) RETURN BOOLEAN
    IS
        ck_ NUMBER := 0;
        CURSOR check_view IS
            SELECT 1
            FROM   user_views uv
            WHERE  uv.view_name = upper(view_name_);
    BEGIN
        OPEN  check_view;
        FETCH check_view INTO ck_;
        IF check_view%FOUND THEN
            CLOSE check_view;
            RETURN true;
        ELSE
            CLOSE check_view;
            RETURN false;
        END IF;
    END View_Exist;

    ....

END INST_PKG;

当我尝试编译包体时,我收到如下错误消息:

Compilation errors for PACKAGE BODY INST_PKG

Error: PLS-00452: Subprogram 'VIEW_EXIST' violates its associated pragma
Line: 684
Text: FUNCTION View_Exist (

显然,我的写作没有数据库状态"没有违反,因为函数中没有DML语句。有没有人见过这种行为?

当然,我可以删除Pragma引用,但这会破坏目的。

值得注意的是: 我的数据库已从Oracle 10g实例导出,并已重新导入到12c。 (这是一个升级测试,正如您可能想象的那样)。因此,我在Oracle 12c上收到了上述错误。

我试图删除并重新创建包,但这似乎并没有改变。

我感觉可能存在导入错误的库引用,因为当我删除包时,同一错误会出现在另一个包中,该包中包含一个同名的函数。但是当我重新创建INST_PKG时,第二个包编译得很好,几乎就好像第一个包中的问题掩盖它在第二个包中被标记一样。

2 个答案:

答案 0 :(得分:2)

从您显示的链接中可以看出,问题是USER_VIEWS中的错误导致的(Oracle忘记将PRAGMA restrict_references与NO_ROOT_SW_FOR_LOCAL关联)。

在这种情况下,您可以确定您的函数不违反WNDS断言(不写入数据库),因此只需使用TRUST选项在编译期间禁用断言验证:

yyyymm

答案 1 :(得分:0)

感谢你指点我正确的方向@MuhammadMuzzam。问题是user_views有一些参考文献显然违反了Oracle 12中的Pragma。

似乎是一个已知问题:

https://community.oracle.com/thread/3650610?start=0&tstart=0