如何执行动态表名的查询???

discover_net 2006-11-09 11:44:47
有一存储过程,其中有一个参数,这个参数是用户输入的表名,在存储过程里面根据传入的表名做一个查询,并将查询的结果显示出来.
create procedure test(tableName varchar)
as
begin
select * from tableName --这里如何实现???????????????
end;

...全文
412 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxbyhcsdn 2006-11-30
  • 打赏
  • 举报
回复
你要建立一个包,包里面用游标才能返回行集

>包的定义
1) 包头
create or replace package mypk
as
type t_cursor is ref cursor;
procedure proc(name varchar2,c out t_cursor,a number);
end;

2) 包体
create or replace package body mypk
as
procedure proc(name varchar2,c out t_cursor,a number)
as
begin
open c for select * from test where id=a and name=name;
end proc;
end;
discover_net 2006-11-10
  • 打赏
  • 举报
回复
to doer_ljy:
我查了DBMS_SQL的一些资料,不过不太明白,你可否举个例子.
to xiaoxiao1984:
我需要创建的是存储过过程,可否讲解一下.
xiaoxiao1984 2006-11-10
  • 打赏
  • 举报
回复
可以通过脚本来实现,
ex:
set serverout on size 10000000;
select * from &tablename;
set serverout off;

保存为c:\test.sql
然后执行 @c:\test.sql
doer_ljy 2006-11-10
  • 打赏
  • 举报
回复
oracle的包里面提供了动态SQL的解决办法。并且可以取回多条记录。查查dbms_sql等包。
或者创建动态的cursor等等!
discover_net 2006-11-10
  • 打赏
  • 举报
回复
非常感谢dole_ljy.
doer_ljy 2006-11-10
  • 打赏
  • 举报
回复
下面的例子可以实现sqlplus中desc tablename的功能
declare
c number;
d number;
col_cnt integer;
f boolean;
rec_tab dbms_sql.desc_tab;
col_num number;
procedure print_rec(rec in dbms_sql.desc_rec) is
begin
dbms_output.new_line;
dbms_output.put_line('col_type = '
|| rec.col_type);
dbms_output.put_line('col_maxlen = '
|| rec.col_max_len);
dbms_output.put_line('col_name = '
|| rec.col_name);
dbms_output.put_line('col_name_len = '
|| rec.col_name_len);
dbms_output.put_line('col_schema_name = '
|| rec.col_schema_name);
dbms_output.put_line('col_schema_name_len = '
|| rec.col_schema_name_len);
dbms_output.put_line('col_precision = '
|| rec.col_precision);
dbms_output.put_line('col_scale = '
|| rec.col_scale);
dbms_output.put('col_null_ok = ');
if (rec.col_null_ok) then
dbms_output.put_line('true');
else
dbms_output.put_line('false');
end if;
end;
begin
c := dbms_sql.open_cursor;

dbms_sql.parse(c, 'select * from scott.bonus', dbms_sql);

d := dbms_sql.execute(c);

dbms_sql.describe_columns(c, col_cnt, rec_tab);

col_num := rec_tab.first;
if (col_num is not null) then
loop
print_rec(rec_tab(col_num));
col_num := rec_tab.next(col_num);
exit when (col_num is null);
end loop;
end if;

dbms_sql.close_cursor(c);
end;
/

同理可以取出你动态表明的各个列的类型然后动态建立cursor,fetch出结果
discover_net 2006-11-09
  • 打赏
  • 举报
回复
回复Visual_Studio_Net:
好象execute immediate只能返回单行记录.而且我使用过这种方法,但无法在缓冲区显示输出结果.
恢复Eric_1999:
我就是要实现根据用户输入的表,查询所对应的表记录功能的存储过程.但不知道怎么做?
Eric_1999 2006-11-09
  • 打赏
  • 举报
回复
楼主要干吗?
pl/sql中select一定要有into
上面的动态sql可以用
exec 'select * from ' tableName;
Visual_Studio_Net 2006-11-09
  • 打赏
  • 举报
回复
execute immediate 'select ...from '||tableName;

3,491

社区成员

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

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