declare tablename varchar(50);
begin
tablename := '&请输入表名';
--如果用户输入的是emp 那就查询emp表
--如果用户输入的是dept 那就查询dept表
-- 以此类推
-- ...... 那么我的 select * from (这里应该怎么写)
end;
也就是要完成用户指定要查询什么表
begin
tablename := '&请输入表名';
--如果用户输入的是emp 那就查询emp表
--如果用户输入的是dept 那就查询dept表
-- 以此类推
-- ...... 那么我的 select * from (这里应该怎么写)
end;
也就是要完成用户指定要查询什么表
SQL> select * from &table_name;
Enter value for table_name: dept
old 1: select * from &table_name
new 1: select * from dept DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
type mycursor is ref cursor;
tn varchar(50);
my mycursor;
begin
tn := '&请输入表名';
open my for select * from tn; --这里的tn我是想他是个变量 可在这里系统就把它当成了tn
loop
dbms_output.put_line(my.ename); -- 如果用户输入的是emp的话就打这句
end loop;
close my;end;
SQL> declare
2 v_name varchar2(20);
3 type mycursor is ref cursor;
4 my_cursor mycursor;
5 begin
6 open my_cursor for select ename from &table_name;
7 loop
8 fetch my_cursor into v_name;
9 exit when my_cursor%notfound;
10 dbms_output.put_line(v_name);
11 end loop;
12 close my_cursor;
13 end;
14 /
Enter value for table_name: emp
old 6: open my_cursor for select ename from &table_name;
new 6: open my_cursor for select ename from emp;
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLERPL/SQL procedure successfully completed.
SQL> declare
2 v_name varchar2(20);
3 type mycursor is ref cursor;
4 my_cursor mycursor;
5 begin
6 open my_cursor for select ename from &table_name;
7 loop
8 fetch my_cursor into v_name;
9 exit when my_cursor%notfound;
10 dbms_output.put_line(v_name);
11 end loop;
12 close my_cursor;
13 end;
14 /
Enter value for table_name: userinfo
old 6: open my_cursor for select ename from &table_name;
new 6: open my_cursor for select ename from userinfo;
haha
hohoPL/SQL procedure successfully completed.
----------
haha
hoho
如果是这样的话,sql语句里table名是静态部分,不能用变量的方式,所以要实现用动态sql的方式
可以用
execute immeidate
或者
open cursor for sql的方式你这里使用下面一种
open my for 'select * from '||tn;
begin
tablename := '&请输入表名';
--如果用户输入的是emp 那就查询emp表
--如果用户输入的是dept 那就查询dept表
-- 以此类推
-- ...... 那么我的 select * from (这里应该怎么写)
end;
也就是要完成用户指定要查询什么表declare
v_num number(10):=0;beginselect count(*) into v_num from &p_tablename;
dbms_output.put_line('v_num='||v_num);end;
楼主直接在匿名块中执行select是不行的,必须要把其查询到的东东交给一个变量保存着。
还是没达到用户输入什么表就查询什么表 我说的查询表 不是查count 是select *
#14的回复已经说明了,这个只能用动态语句,用变量保存表名,用sys_refcursor传出查询结果。
但是问题是,你查出来的结果要显示在哪里?
如果是用户输入哪个表名就 查哪个表的话,各个表之间的结构不同,那如何处理结果cursor?所以啊,最好把这个问题的前因后果也说出来,这样大家才好帮你想办法