请教EXECUTE IMMEDIATE

[复制链接]
查看11 | 回复8 | 2015-10-19 09:57:44 | 显示全部楼层 |阅读模式
declare
type t_table is table of varchar2(50);
v_tabel t_table;
cursor c is
select table_name from dic t where table_name LIKE 'AT%';
V_SQL VARCHAR(200);
maxginteger;
begin
open c;
FETCH c BULK COLLECT
INTO v_tabel;
FOR i IN v_tabel.FIRST .. v_tabel.LAST LOOP
DBMS_OUTPUT.PUT_LINE(v_tabel(i));
V_SQL := 'select count(*) from ' || v_tabel(i);
EXECUTE IMMEDIATE V_SQL into maxg;
DBMS_OUTPUT.PUT_LINE(maxg);
END LOOP;
CLOSE c;
END;
执行到execute immediate 提示视图不存在。。。 游标能取到值。。。
回复

使用道具 举报

千问 | 2015-10-19 09:57:44 | 显示全部楼层
权限问题
回复

使用道具 举报

千问 | 2015-10-19 09:57:44 | 显示全部楼层
那你就执行到这一步,看下v_tabel(i)是什么表,查看这个表是不是存在。代码上没什么问题
不过我觉得最好对去除的结果集做个判断是否有值,因为如果v_tabel是空的,那执行就会报错。
DECLARE
TYPE t_table IS TABLE OF VARCHAR2(50);
v_tabel t_table;
CURSOR c IS
SELECT table_name FROM dict WHERE table_name LIKE 'AT%';
v_sql VARCHAR(200);
maxgINTEGER;
BEGIN
OPEN c;
FETCH c BULK COLLECT
INTO v_tabel;
IF v_tabel IS NOT NULL AND
v_tabel.count > 0
THEN
FOR i IN v_tabel.first .. v_tabel.last
LOOP
dbms_output.put_line(v_tabel(i));
v_sql := 'select count(*) from ' || v_tabel(i);
EXECUTE IMMEDIATE v_sql

INTO maxg;
dbms_output.put_line(maxg);
END LOOP;
END IF;
CLOSE c;
END
回复

使用道具 举报

千问 | 2015-10-19 09:57:44 | 显示全部楼层
那个视图是不是涉及到其他实例或数据库的表?看看权限
回复

使用道具 举报

千问 | 2015-10-19 09:57:44 | 显示全部楼层
fuyinzhen 发表于 2011-11-8 13:54
那你就执行到这一步,看下v_tabel(i)是什么表,查看这个表是不是存在。代码上没什么问题
不过我觉得最好 ...

还是提示表和视图不存在!我看看权限吧!
回复

使用道具 举报

千问 | 2015-10-19 09:57:44 | 显示全部楼层
加个异常打出来就可以看到了,肯定没有访问权限
回复

使用道具 举报

千问 | 2015-10-19 09:57:44 | 显示全部楼层
table1
0
table2
0
table3
0
ORA-00942: 表或视图不存在
回复

使用道具 举报

千问 | 2015-10-19 09:57:44 | 显示全部楼层
authid current_user 换成过程,在IS后面BEGIN前加上就可以了,权限问题
回复

使用道具 举报

千问 | 2015-10-19 09:57:44 | 显示全部楼层
本帖最后由 aihuong 于 2011-11-8 15:09 编辑
解决了,我们系统里的数据字典中有好多表都不存在了。

谢谢各位了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行