救命:表或视图不存在(单独执行时没有问题,一放入过程就出现问题了)

HumanZHOU 2007-10-05 09:15:44
SQL> select count(*) from dba_users;

COUNT(*)
----------
31

没有问题

下面:
create or replace procedure ckuName(userName varchar2)
as
num integer;
userName_local varchar2(20);
begin
userName_local := upper(userName);
select count(*) into num from DBA_USERS ;
if num>0 then
execute immediate 'drop user '||userName;
dbms_output.put_line('用户删除成功');
else
dbms_output.put_line('用户不存在');
end if;
end;
/
出错:
Warning: Procedure created with compilation errors

SQL> show error;
Errors for PROCEDURE SYSTEM.CKUNAME:

LINE/COL ERROR
-------- ---------------------------------
7/38 PL/SQL: ORA-00942: 表或视图不存在7/8 PL/SQL: SQL Statement ignored
...全文
391 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
凤影 2007-10-06
  • 打赏
  • 举报
回复
解决方案是GRANT SELECT ANY DICTIONARY TO YOURUSER;

GRANT DBA TO YOURUSER;不行。

oracle 10g XE 测试通过。 记得9i中也有此问题。
迷失的空间 2007-10-06
  • 打赏
  • 举报
回复
我觉得是权限没有设置好!
HumanZHOU 2007-10-06
  • 打赏
  • 举报
回复

确实是没有权限,当我在 sys 下运行一条语句 grant select on dba_users to system; 然后,再运行上面的过程
没有出错,通过了. 难理解的是,为什么单独执行 select * from dba_users; 是有权限的,
而在过程里面执行 select count(*) into num from dba_users; 却没有权限了.


还有一个疑问:
就是上述过程成功创建后执行调用语句:execute ckuName('admin');是出错,提示是:权限不足.

与上面相同,单独执行:drop users admin ; 删除成功.
用过程执行:失败,权限不足.

然后再在 sys 模式下授权 : grant drop user to system; 调用:execute ckuName('admin'); 运行成功.

总结出疑问:为什么 system 用户下,单独执行一条查询语句: select * from dba_users; 成功得到查询结果
而该将查询语句 写入过程 就权限不足了?

为什么 system 用户下,单独执行语句:drop user admin; 可以运行成功,
而将该项语句放入过程 又 是权限不足了?

HumanZHOU 2007-10-05
  • 打赏
  • 举报
回复
我用的也是 pl/sql developer
还是有问题,不过我把相同的代码在 sys 模式下运行
却是对的
tianhxk 2007-10-05
  • 打赏
  • 举报
回复
通过sqlplus执行过的存储过程为 system.ckuName,通过pl/sql developer或取的代码为
create or replace procedure system.ckuName(userName varchar2)
as
num integer;
userName_local varchar2(20);
begin
userName_local := upper(userName);
select count(*) into num from DBA_USERS ;
if num >0 then
execute immediate 'drop user ' ||userName;
dbms_output.put_line( '用户删除成功 ');
else
dbms_output.put_line( '用户不存在 ');
end if;
end;
这样在pl/sql developer执行也会报错的,问题是出在system.上,但是原因不知道!

编译成功的代码如下
create or replace procedure ckuName(userName varchar2)
as
num integer;
userName_local varchar2(20);
begin
userName_local := upper(userName);
select count(*) into num from DBA_USERS ;
if num >0 then
execute immediate 'drop user ' ||userName;
dbms_output.put_line( '用户删除成功 ');
else
dbms_output.put_line( '用户不存在 ');
end if;
end;
tianhxk 2007-10-05
  • 打赏
  • 举报
回复
使用sqlplus执行确实会报错,但是我用pl/sql developer执行不报错!
HumanZHOU 2007-10-05
  • 打赏
  • 举报
回复
我是在 system 用户下,如果说没有权限,可是单独执行是可以显示出结果的啊.

只是一放进过程里面就出错了
tianhxk 2007-10-05
  • 打赏
  • 举报
回复
是不是你用了不同的用户?而create function时对该表无权限,我用我的oracle测试,如果有权限不会报错

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧