呼唤
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版 - 生产)
它确实; 至少在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时间将不会改变,因为它不会查看有效的包.
归档时间: |
|
查看次数: |
17599 次 |
最近记录: |