create or replace procedure test
(
v_table in varchar
)
is
begin
execute immediate 'select * from ' ||  v_table;
end;我想把表名当做参数传入,然后动态执行。但我怎么才能取回查找后的结果集。如果定义一个sys_refcursor的游标cursorName ,拼到'open cursorName for select * from '字符串里,
这样会报错。大家帮帮忙,怎么才能取回动态执行后的结果集?

解决方案 »

  1.   


    create or replace procedure test(v_table in varchar,cu out sys_refcursor) is
    begin
      open cu for  'select * from ' || v_table;
    end;declare
    v_table varchar2(10):='EMP';
    cu sys_refcursor ;
    emptype emp%rowtype;
    begin
    test(v_table,cu);
    loop
    fetch cu into emptype;
    exit when cu%notfound;
    dbms_output.put_line(emptype.empno);
    end loop;
    end;
      

  2.   

    --这样不行??create or replace procedure test
    (
    v_table in varchar;
    type refcur is Ref Cursor;
    cur refcur;
    v_sql varchar2(100);
    )
    is
    begin
    v_sql := 'select * from ' ||  v_table;
    open cur for v_sql;
    end;
      

  3.   

    create or replace procedure test
    (
    v_table in varchar
    ,p_cur out sys_refcursor;
    )
    is
    begin
        open p_cur for 'select * from ' ||  v_table;
    end;
      

  4.   


    create or replace procedure test
    (
    v_table in varchar;
    )
    is
    type refcur is Ref Cursor;
    cur refcur;
    v_sql varchar2(100);
    begin
    v_sql := 'select * from ' ||  v_table;
    open cur for v_sql;
    end;
      

  5.   

    --tom写的print_table
    --将一个查询的结果 记录by记录 地列出来
    create or replace procedure print_table( p_query in varchar2 )
    AUTHID CURRENT_USER
    is
    l_theCursor integer default dbms_sql.open_cursor;
    l_columnValue varchar2(4000);
    l_status integer;
    l_descTbl dbms_sql.desc_tab;
    l_colCnt number;
    begin
    execute immediate
    'alter session set
    nls_date_format=''dd-mon-yyyy hh24:mi:ss'' ';dbms_sql.parse( l_theCursor, p_query, dbms_sql.native );
    dbms_sql.describe_columns
    ( l_theCursor, l_colCnt, l_descTbl );for i in 1 .. l_colCnt loop
    dbms_sql.define_column
    (l_theCursor, i, l_columnValue, 4000);
    end loop;l_status := dbms_sql.execute(l_theCursor);while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
    for i in 1 .. l_colCnt loop
    dbms_sql.column_value
    ( l_theCursor, i, l_columnValue );
    dbms_output.put_line
    ( rpad( l_descTbl(i).col_name, 30 )
    || ': ' ||
    l_columnValue );
    end loop;
    dbms_output.put_line( '-----------------' );
    end loop;
    execute immediate
    'alter session set nls_date_format=''dd-MON-rr'' ';
    exception
    when others then
    execute immediate
    'alter session set nls_date_format=''dd-MON-rr'' ';
    raise;
    end;
    /
      

  6.   

    用FOR ROW1 IN (SELECT * FROM TABLENAME) LOOP
       
    可以 ROW1.栏位名 做动作啊END LOOP;
      

  7.   

    一般是存储过程返回游标,java/.net应用程序接收这个游标.
      

  8.   

    create or replace procedure test
    (
    v_table in varchar,mycur out sys_refcursor
    ) is begin
      open mycur for  
    'select * from ' || v_table;
    end;