create or replace procedure p_get_table_file(tablename in varchar2)
is
type c_CurRef is ref cursor;
r_curref c_CurRef;
begin
   open r_curref for 'select * from '||tablename;
   fetch r_curref into ***  /*tablename是用户输入的一个表名,这里的这个变量如何定义?*/end p_get_table_file;
希望高手指点迷津,谢谢!

解决方案 »

  1.   


    声明语句变量:v_sql varchar2(100);
    先构造 v_sql语句:v_sql:='select * from '||tablename;
    然后再 open r_curref for V_SQL;
      

  2.   

    哥们,你理解错了,我是说fetch into到的那个变量如何定义?
      

  3.   

    以你的意图来看,得用dbms_sql这个包解析,然后fetch表中的数据
      

  4.   

    可以使用隐式游标,这样就不要定义变量去接收了
    隐式游标不用明确建立游标变量
    CURSOR FOR LOOP,用于for loop语句例 for my_dept_rec in ( select department_name, department_id from departments)
     loop
      dbms_output.put_line(my_dept_rec.department_id || ' : ' || my_dept_rec.department_name);
     end loop;
      

  5.   

    tablename是一个变量,不是固定的表
      

  6.   

    这里要用完全的动态sql,原理其实很简单,就是先把要执行的pl/sql块拼成字符串,然后执行
    create or replace procedure p_get_table_file(tablename in varchar2) is
       w_sql varchar2(32000) :=
       'declare
           type c_CurRef is ref cursor;
           r_curref c_CurRef;
           w_rec '||tablename||'%rowtype;
        begin
           open r_curref for ''select * from '||tablename||''';
           fetch r_curref into w_rec;
           -- do whatever you want with the data
        end;';
    begin
       execute immediate w_sql;
    end p_get_table_file;