2016-01-31 35 views
2

我的包报头的代码如下所示:PL/SQL语用错误违反

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 (

显然,我的“写入数据库状态”的编译不是v iolated,因为函数中没有DML语句。有没有人见过这样的行为?

当然,我可以放弃Pragma的参考,但这样做会失败目的。

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

我试图删除并重新创建软件包,但似乎没有改变的东西。

我有一种感觉,可能有一个库引用的地方已导入错误,因为当我放弃包,相同的错误出现在另一个包,其中包含一个相同的名称的函数。但是当我重新创建INST_PKG时,第二个包编译得很好,就好像第一个包中的问题掩盖了它在第二个包中的标记。

+0

这可能有助于你:http://www.orafaq.com/usenet/comp.databases.oracle.server/2005/06/01/0035.htm –

回答

2

它从你显示的链接出现,这个问题是一个结果USER_VIEWS中的一个错误(Oracle忘记将PRAGMA restrict_references与NO_ROOT_SW_FOR_LOCAL关联)。

在这种情况下,你可以肯定,你的功能不违反WNDS断言(不写入数据库),因此只需使用TRUST选项编译时禁用断言验证:

PRAGMA restrict_references (Check_View, WNDS, TRUST);