[英]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.