繁体   English   中英

修改为过程后,Oracle PL / SQL匿名块停止工作

[英]Oracle PL/SQL anonymous block stopped working after modified into procedure

我写了一个匿名块,可以正常工作。 SQL%ROWCOUNT告诉我已处理了n行:

declare
    user_list varchar2(100) := 'TESTUSER';
    v_test number;
begin
execute immediate '
    insert into config_all_objects (
    owner
    , object_name
    , object_type
    , created
    , status
    )
    select
    owner
    , object_name
    , object_type
    , created
    , status
    from all_objects
    where regexp_like(owner, ''^('||user_list||')$'', ''i'')'
    ;

    dbms_output.put_line(sql%rowcount);

end;
/

然后将其更改为存储过程,并在运行时处理了0行:

create or replace procedure p_test2(
    user_list varchar2
)
as
    v_test number;
    v_user_list varchar2(100) := user_list;
begin
execute immediate '
    insert into config_all_objects (
    owner
    , object_name
    , object_type
    , created
    , status
    )
    select
    owner
    , object_name
    , object_type
    , created
    , status
    from all_objects
    where regexp_like(owner, ''^('||v_user_list||')$'', ''i'')'
    ;

    dbms_output.put_line(sql%rowcount);

end;
/

begin p_test2 (user_list => 'TESTUSER');
end;
/

这是为什么?

我检查了两种情况下的立即执行命令是否完全相同。

另外,我确保用于运行这两个代码的用户(eiauto)在该表上具有直接授予权限...

grant select on all_objects to eiauto;

这是config_all_objects表的DDL:

CREATE GLOBAL TEMPORARY TABLE CONFIG_ALL_OBJECTS
                ON COMMIT PRESERVE ROWS
                as select 
                owner
                , object_name
                , object_type
                , created
                , status
                from all_objects
                where 1=2

编辑:我真的不能回答这个,但我找到了一种解决方法:代替ALL_OBJECTS使用DBA_OBJECTS表,可以正常工作。

这也将我带到可能的原因。 从Oracle文档中:

ALL_OBJECTS描述当前用户可访问的所有对象。

DBA_OBJECTS描述数据库中的所有对象。

我想这与特权有关...

我相信这是由于“ ALL_”字典视图的性质而发生的。 默认情况下,存储过程以“调用者的权限”运行。

AUTHID CURRENT_USER子句可以解决此问题。

像这样:

create or replace procedure p_test2(
    user_list varchar2
) AUTHID CURRENT_USER
as
var1 NUMBER;
begin
 --code here
end p_test2;

文档: https : //docs.oracle.com/cd/E11882_01/timesten.112/e21639/accesscntl.htm#TTPLS275

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM