DBMS_UTILITY.COMPILE_SCHEMA(schema =>'<SCHEMA_NAME>',compile_all => FALSE)不编译无效的包体

Tor*_*oru 3 oracle plsql

呼唤

BEGIN
    DBMS_UTILITY.COMPILE_SCHEMA(schema => '<SCHEMA_NAME>', compile_all => FALSE);
END;
/
Run Code Online (Sandbox Code Playgroud)

不编译无效的包体.有人知道原因吗?

(Oracle Database 11g企业版11.2.0.1.0版 - 生产)

Ale*_*ole 9

它确实; 至少在11.2.0.3中,所以我想基础版本中可能存在一个错误.

如果我创建了一个无效的包,在这种情况下,因为它引用了一个不存在的表:

create package p42 as
  procedure test;
end p42;
/

PACKAGE P42 compiled

create package body p42 as
  procedure test is
    n number;
  begin
    select count(*) into n from t42;
  end test;
end p42;
/

PACKAGE BODY P42 compiled
Errors: check compiler log
Run Code Online (Sandbox Code Playgroud)

然后检查状态和最后的DDL时间:

select object_type, object_name, status, last_ddl_time
from user_objects where object_name = 'P42'
order by object_type, object_name;

OBJECT_TYPE         OBJECT_NAME          STATUS  LAST_DDL_TIME      
------------------- -------------------- ------- -------------------
PACKAGE             P42                  VALID   2015-03-02 17:39:42 
PACKAGE BODY        P42                  INVALID 2015-03-02 17:39:42 
Run Code Online (Sandbox Code Playgroud)

然后重新编译模式并再次检查:

BEGIN
    DBMS_UTILITY.COMPILE_SCHEMA(schema => USER, compile_all => FALSE);
END;
/

anonymous block completed

select object_type, object_name, status, last_ddl_time
from user_objects where object_name = 'P42'
order by object_type, object_name;

OBJECT_TYPE         OBJECT_NAME          STATUS  LAST_DDL_TIME      
------------------- -------------------- ------- -------------------
PACKAGE             P42                  VALID   2015-03-02 17:39:42 
PACKAGE BODY        P42                  INVALID 2015-03-02 17:39:49 
Run Code Online (Sandbox Code Playgroud)

..最后一次DDL时间已经改变,所以它被重新编译.由于我没有解决潜在的问题,它仍然无效.我可以看到

select text from user_errors where name = 'P42';

TEXT                                                        
------------------------------------------------------------
PL/SQL: ORA-00942: table or view does not exist              
PL/SQL: SQL Statement ignored                                
Run Code Online (Sandbox Code Playgroud)

或者,如果您'<SCHEMA_NAME>'不是当前用户all_errors,如果它仍然无效,则会进入.

如果我创建缺少的表并再次编译模式:

create table t42 (id number);

Table t42 created.

BEGIN
    DBMS_UTILITY.COMPILE_SCHEMA(schema => USER, compile_all => FALSE);
END;
/

anonymous block completed

select object_type, object_name, status, last_ddl_time
from user_objects where object_name = 'P42'
order by object_type, object_name;

OBJECT_TYPE         OBJECT_NAME          STATUS  LAST_DDL_TIME      
------------------- -------------------- ------- -------------------
PACKAGE             P42                  VALID   2015-03-02 17:39:42 
PACKAGE BODY        P42                  VALID   2015-03-02 17:40:11 
Run Code Online (Sandbox Code Playgroud)

...最后的DDL时间再次发生变化,现在状态也是如此.如果我再次使用您的compile_all => FALSE标志进行编译,那么最后的DDL时间将不会改变,因为它不会查看有效的包.