动态SQL,怎么只能查出当前用户的表的记录数?急寻答案,谢谢!

[复制链接]
查看11 | 回复2 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
以下函数,为什么只能查出当前用户的表的记录数?
我的需求是用一个procedure计算所有Oracle用户所有表的记录数.而数据库里现在有多少用户,是动态改变的.
比如:
该函数如果在scott里创建,通过scott登陆则查询不了system的表;
若在system里创建,通过system登陆,则查询不了scott的表;
我把以下存储过程,使用本地动态SQL实现,现象也如上面所描述的一样.
急寻答案,谢谢!

CREATE OR REPLACE function get_row_cnts(p_tname in varchar2) return number
as
v_the_cursor
int;
v_column_value
number default NULL;
v_status
int;
begin

v_the_cursor := dbms_sql.open_cursor;
dbms_sql.parse(c=>v_the_cursor,statement=>'select count(*) from '||p_tname,language_flag=>dbms_sql.native);
dbms_sql.define_column(c=>v_the_cursor,position=>1,column=>v_column_value);
v_status := dbms_sql.execute(v_the_cursor);
if ( dbms_sql.fetch_rows(c=>v_the_cursor) > 0) then

dbms_sql.column_value(c=>v_the_cursor,position=>1,value=>v_column_value);

end if;

dbms_sql.close_cursor(c=>v_the_cursor);
return v_column_value;
exception
when others then

dbms_output.put_line('=========>'||sqlerrm);

dbms_sql.close_cursor(c=>v_the_cursor);

RAISE;

end;
/


CREATE OR REPLACE PROCEDURE OBJECT_cont
(v_collection_time date)
AS
v_segment_name dba_segments.segment_name%type;
v_owner
dba_segments.owner%type;
v_bytes
number;
v_count
int;
str_tmep
varchar(400);
cursor tab_info is
select segment_name,owner,bytes/1024/1024 from DBA_SEGMENTS where segment_type = 'TABLE';
BEGIN


open tab_info;

loop

fetch tab_info into v_segment_name,v_owner,v_bytes;

exit when tab_info%notfound;



str_tmep := 'select count(*) from c_ynunicom.'||v_segment_name;


EXECUTE IMMEDIATE str_tmepinto v_count;



.......................................................

commit;



end loop;

close tab_info;

END;
/
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
思路提供:
1.创建用户的时候把dba_tables表的select权限分配给创建的用户.可以的话创建同义词.
这些肯定需要使用动态sql来完成.
2.从该系统表中就可以查到总共用户的表了
3.建议使用动态sql使用格式为 execute immediate sqlstr;来执行动态sql'语句.
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
感谢,怕您有些误会我的做法:
我在dba_segment里,已经可以查询全部用户的对象,
select segment_name,ownerfrom DBA_SEGMENTS where segment_type = 'TABLE';
就可以查询出所有的表及该表所属用户,此时把
owner.segment_name传给在上面编写的函数,只有当前用户的对象可以执行,而其他对象的,传入则反馈计算无此表或视图.
但把语句放入sqlplus里执行,是完全可以执行的.创建函数的用户,我分配的权限已经从dba升级为sysdba都不行.

最初由 zflying2000 发布
[B]思路提供:
1.创建用户的时候把dba_tables表的select权限分配给创建的用户.可以的话创建同义词.
这些肯定需要使用动态sql来完成.
2.从该系统表中就可以查到总共用户的表了
3.建议使用动态sql使用格式为 execute immediate sqlstr;来执行动态sql'语句. [/B]
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行