ORACLE 从 ALL_SOURCE 中选择在例程内执行时产生空结果

ORACLE Selecting from ALL_SOURCE yields empty result when executed from within routine

我有一个例程,其任务是从 ALL_SOURCE 中提取代码。这是使用以下游标完成的:

    CURSOR w_cur ( p_name VARCHAR2 , p_type VARCHAR2) IS
                   SELECT text , line
                     FROM ALL_SOURCE
                    WHERE UPPER(TYPE)  = UPPER(p_type)
                      AND UPPER(NAME)  = UPPER(p_name)
                      AND UPPER(OWNER) = UPPER(NVL(G_Owner_to_User,USER))
                    ORDER BY line
                    ;

我正在从具有 DBA 和 SYS 权限的用户执行此例程。 尝试提取 "PACKAGE" 的 "BODY" 时,如果包属于同一个用户 运行 程序,我会得到正确的结果。另一方面,如果我尝试提取属于另一个用户的包的 "BODY",我会得到一个空结果。

有趣的是,当 运行 以上 "SELECT" 来自 SQL 开发人员(同一用户)时,我确实得到了预期的代码。

这看起来像是 "PRIVILEGE" 相关的东西,但我不知道为什么我会得到不同的结果以及缺少哪个权限。

感谢您的评论。

费尔南多。

使用 AUTHID CURRENT_USER 创建过程,Oracle 将使用调用者的角色来确定访问权限。默认值为 AUTHID DEFINER,不包括通过角色授予的权限(除了像 PUBLIC 这样的特殊角色)。

这些函数显示了 ALL_SOURCE 的调用者和定义者权限之间的区别。

create or replace function count_source_invoker return number authid current_user is
    v_count number;
begin
    select count(*) into v_count from all_source;
    return v_count;
end;
/

create or replace function count_source_definer return number authid definer is
    v_count number;
begin
    select count(*) into v_count from all_source;
    return v_count;
end;
/

select
    (select count(*) from all_source) real_count,
    count_source_invoker,
    count_source_definer
from dual;

结果:

REAL_COUNT   COUNT_SOURCE_INVOKER   COUNT_SOURCE_DEFINER
----------   --------------------   --------------------
333677       333677                 142871