首页 文章

Oracle PLSQL依赖链(无效对象)

提问于
浏览
2

我正在阅读一篇文章 - “程序与程序包” - 我发现了这句话:

打破依赖关系链(安装新的包体时没有级联失效 - 如果你有调用过程的过程 - 编译一个将使数据库无效)

我尝试过,但没有看到任何无效的对象 . 下面是我在Oracle 12C上使用的代码 .

create or replace procedure B 
as 
begin 
null; 
End; 

create or replace procedure A 
as 
begin 
B; 
end; 

alter procedure B compile;

select object_type, object_name, status 
from user_objects 
Where Status = 'INVALID' 
order by object_type, object_name

我是否遗漏了Oracle 12c中的某些内容或更改内容?

1 回答

  • 2

    这与finer grained dependencies from 11g有关 . 您的示例在10g中使A无效,但在11g中无效 . 所以不,它改变了11g,而不是12c ......

    invalidation of dependent objects上的文档说:

    直接依赖项仅通过对影响它们的引用对象的更改(对引用对象的签名的更改)无效 .

    在11g中,如果您使用 alter 重新编译它,或者如果重复整个 create or replace 语句,则A程序不会失效:

    alter procedure B compile;
    
    select ...
    
    no rows selected
    
    create or replace procedure B
    as 
    begin 
    null;
    end; 
    /
    
    select ...
    
    no rows selected
    

    但是如果过程签名发生更改,它仍然会失效 - 如果添加参数参数:

    create or replace procedure B (x number)
    as 
    begin 
    null;
    End; 
    /
    
    select object_type, object_name, status 
    from user_objects 
    Where Status = 'INVALID' 
    and object_name in ('A','B')
    order by object_type, object_name;
    
    OBJECT_TYPE         OBJECT_NAME          STATUS 
    ------------------- -------------------- -------
    PROCEDURE           A                    INVALID
    

相关问题