declare tablename varchar(50);
begin
  tablename := '&请输入表名';
    --如果用户输入的是emp 那就查询emp表
  --如果用户输入的是dept 那就查询dept表
  -- 以此类推
  -- ......  那么我的  select * from (这里应该怎么写)
end;
也就是要完成用户指定要查询什么表

解决方案 »

  1.   

    存储过程里不能使用select语句 可以直接在SQL*PLUS下使用变量来实现
    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
      

  2.   

    文件要保存的额 在plsqldev里写个脚本可以么
      

  3.   

    貌似我看不懂   Oracle刚学 能把每一步打个注释么
      

  4.   

    我只打一部分说明意思  原代码如下declare
      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;
      

  5.   

    SQL> set serveroutput on
    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.
      

  6.   

    这样一来那只能查emp表了   如果有userinfo表  而用户输入的又是userinfo   怎么办
      

  7.   

    如果你的userinfo表里有ename列的话也可以
      

  8.   

    SQL> set serveroutput on
    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.
      

  9.   

    也可以实现呀SQL> select * from userinfo;ENAME
    ----------
    haha
    hoho
      

  10.   

    小兔的方式也可以, &后面的是替代变量。不过可能你的是想用变量的方式来实现
    如果是这样的话,sql语句里table名是静态部分,不能用变量的方式,所以要实现用动态sql的方式
    可以用
    execute immeidate
    或者
    open cursor for sql的方式你这里使用下面一种
    open my for 'select * from '||tn;
      

  11.   

    declare tablename varchar(50); 
    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是不行的,必须要把其查询到的东东交给一个变量保存着。
      

  12.   


    还是没达到用户输入什么表就查询什么表   我说的查询表  不是查count  是select *
      

  13.   


    #14的回复已经说明了,这个只能用动态语句,用变量保存表名,用sys_refcursor传出查询结果。
    但是问题是,你查出来的结果要显示在哪里?
    如果是用户输入哪个表名就 查哪个表的话,各个表之间的结构不同,那如何处理结果cursor?所以啊,最好把这个问题的前因后果也说出来,这样大家才好帮你想办法
      

  14.   

    就一句话  查询用户输入的表名  的所有字段  用dbms_output输出