文档章节

Oracle存储过程ORA-00942: table or view does not exist详解

k
 kaixinguo314
发布于 2017/06/21 12:08
字数 1028
阅读 155
收藏 0

怎么就不对了

今天在写存储过程的时候,发现一个很诡异的问题,存储过程里就一个最简单的SELECT动态SQL语句。编写完成以后,执行这个存储过程,总是提示ORA-00942: table or view does not exist(ERROR -942 ORA-00942: 表或视图不存在)这个错误,但是我将这个SQL语句复制出来,单独在命令行运行,而又没有任何错误。很纠结,很纳闷,很无解,好好的一个SELECT语句,在命令行里就可以执行,放到存储过程就会出错了,怎么就不对了?

先剧透

后来经过Google,分析和总结,最终找到了答案。为了满足有的读者就是为了找到解决问题的答案,而并不需要接下来长篇大论的分析,我这里就先给出答案。

角色在函数、存储过程、触发器中都是失效的,也就是说,用户从角色继承过来的权限,不能在函数、存储过程、触发器中使用。在函数、存储过程、触发器中,如果要访问其他用户的对象,需要显式地给用户授予访问的权限。

上面就是解决ORA-00942: table or view does not exist(ERROR -942 ORA-00942: 表或视图不存在)这个错误的答案。如果你的存储过程中访问了其他用户的对象,而你当前登陆用户的权限是以角色的形式赋予的,并非显式赋予的,这个时候这个错误。明白人看到这里应该知道怎么解决了,如果你还是一头雾水,请允许我继续唠叨,看看下面详细的分析。

再详解

我现在在我的测试库上模拟一个出现ORA-00942: table or view does not exist(ERROR -942 ORA-00942: 表或视图不存在)这个错误的场景。

-- SYS用户创建两个用户,并赋予DBA角色权限
create user jelly identified by 123456;
create user jelly2 identified by 123456;

grant dba to jelly; -- 角色赋权
grant dba to jelly2; -- 角色赋权

-- jelly用户创建表tb_student,并插入测试数据
create table tb_student(id varchar2(10), name varchar2(20), age number(3), sex varchar2(2));
insert into tb_student values('68003001', '果冻', 23, 'M');
insert into tb_student values('68003002', '史大为', 24, 'M');
insert into tb_student values('68003003', '李艳', 23, 'F');
insert into tb_student values('68003004', '郝丽', 25, 'F');
insert into tb_student values('68003005', '佟东', 24, 'M');

select * from tb_student;

现在使用jelly2用户登录Oracle,运行以下语句:

-- jelly2用户查询表tb_student
select * from jelly.tb_student;

发现SQL语句可以正确的运行,这并没有问题。接下来,我们在jelly2用户下创建一个存储过程,访问jelly用户下的jelly.tb_student表,源码如下:

CREATE OR REPLACE PROCEDURE "JELLY2"."PRINTALLSTUDENTS" 
as
	type t_cur is ref cursor;
	cursor_stu t_cur;
	id varchar2(10);
	name varchar2(20);
	age number(3);
	sex varchar2(2);
	strSql varchar2(400);
begin
	strSql := 'select * from jelly.tb_student';
	open cursor_stu for strSql;
	loop
		fetch cursor_stu into id, name, age, sex;
		dbms_output.put_line('ID:' || id || ', NAME:' || name || ', AGE:' || age || ', SEX:' || sex);
		exit when cursor_stu%notfound or cursor_stu%notfound is null;
	end loop;
	close cursor_stu;
exception
	when others then
		dbms_output.put_line('ERROR ' || SQLCODE || ' ' || SQLERRM);
		close cursor_stu;
end;

对上面代码不是很熟悉的伙计,请参见这篇《 Oracle学习笔记——批处理利器游标 》。在命令行运行这个存储过程:

SQL> set serveroutput on;
SQL> execute jelly2.PRINTALLSTUDENTS
ERROR -942 ORA-00942: 表或视图不存在
PL/SQL procedure successfully completed

好了,现在就模拟出现了这个错误。

具体解决办法

上面也说了,由于对用户jelly2赋予的是DBA角色,而角色权限在存储过程中是失效的,所以,为了防止访问权限失效,我们需要显示的对jelly2用户赋予访问jelly.tb_student表的权限。

grant select any table to jelly2;

经过显示的赋权,我们再次执行存储过程,就发现不会有问题了。

SQL> set serveroutput on;
SQL> execute jelly2.PRINTALLSTUDENTS
ID:68003001, NAME:果冻, AGE:23, SEX:M
ID:68003002, NAME:史大为, AGE:24, SEX:M
ID:68003003, NAME:李艳, AGE:23, SEX:F
ID:68003004, NAME:郝丽, AGE:25, SEX:F
ID:68003005, NAME:佟东, AGE:24, SEX:M
ID:68003005, NAME:佟东, AGE:24, SEX:M
PL/SQL procedure successfully completed

 

本文转载自:http://www.tuicool.com/articles/2aamEb6

上一篇: 高效查询SQL01
下一篇: 用户权限
k
粉丝 1
博文 172
码字总数 92097
作品 0
杭州
程序员
私信 提问
[20180417]使用10046事件需要什么权限.txt

[20180417]使用10046事件需要什么权限.txt --//今天想调试一个存储过程,发现生产系统的用户居然不能执行: TEST@book> @ &r/10046on 12 old 1: alter session set events '10046 trace name ......

lfreeali
2018/04/17
0
0
0131 ORA-00942 and AUTHID CURRENT_USER

[20180131]ORA-00942 and AUTHID CURRENT_USER.txt --//偶尔写一个存储过程调用一些系统视图.经常遇到一些ORA-00942,有时候很烦.有时候加AUTHID CURRENT_USER可以过去,有一些不行. 1.环境: S...

lfreeali
2018/01/31
0
0
oracle 角色的两个特性和误区

角色的两个特性 1)角色的延迟性 延迟生效 立即让角色生效的方法: set role 角色名; 例如: set role resource; 延迟回收 下面用实验证明延迟回收: 会话(1)scott: sys@ORCL> conn scott...

长平狐
2012/09/19
56
0
【Oracle】-【AWR/Stackpack】-AWR(Stackpack)执行权限

Oracle 9i执行Stackpack(10g是AWR),当前是一个普通账户,没有DBA权限。 SQL> @awrrpt.sql Current Instance v$instance i * ERROR at line 6: ORA-00942: table or view does not exist Sp......

bisal
2013/08/13
0
0
flashback table 闪回表到指定时间或SCN

闪回表特性: 闪回表是对闪回查询的增强。 可以在线操作, 恢复到指定时间点或SCN的任何数据 自动恢复相关属性,如索引,触发器,约束 满足分布式的一致性? 满足数据一致性,所有相关对象将...

长平狐
2013/09/17
566
0

没有更多内容

加载失败,请刷新页面

加载更多

Leetcode PHP题解--D118 350. Intersection of Two Arrays II

D118 350. Intersection of Two Arrays II 题目链接 350. Intersection of Two Arrays II 题目分析 返回给定两个数组的交集。 思路 从数量较多的那个数组开始去另一个数组寻找是否元素存在,...

skys215
16分钟前
2
0
从源码上分析Android View保存数据状态

在Android开发旅途中,经常会遇到系统控件无法满足我们的视觉,交互效果,这个时候我们常常需要自己自定义控件来满足我们的需求。在这个开发探索过程中,我们不可避免得遇到View要保存状态信...

shzwork
17分钟前
2
0
请问AD603AQ和AD603AR有什么区别?

  AD603AQ和AD603AR只是在封装上的区别,前者是双列直插式,后者是贴片式,AD603A系列的温度都是在—40摄氏度到+85摄氏度之间,AD603还有一个系列是AD603S,它的温度是在—55摄氏度到+125摄...

仙溪
18分钟前
2
0
Linux /etc/profile 配置文件修改

1. 执行命令: vi /etc/profile 去类似windows 配置环境变量, 2.修改完,立即生效命令: source /etc/profile

kuchawyz
19分钟前
2
0
对于小白来说素描怎么入门?怎么学习?

素描初学者怎样入门?初学者怎样才能画好素描绘画?画好素描绘画有哪些技巧?想必这些问题都是绘画初学者们比较伤脑筋的问题,那么初学者到底怎样才能画好素描绘画呢?今天收集整理了关于素描...

huihuajiaocheng
20分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部