EXECUTE IMMEDIATE in plsql

前端 未结 4 1736
我在风中等你
我在风中等你 2020-12-16 08:56

How to get a result from this code

EXECUTE IMMEDIATE \'SELECT * FROM \' || table_name

through for loop

The usual m

4条回答
  •  轮回少年
    2020-12-16 09:24

    If you really need to select * from dynamic table name, then I'd probably go with dbms_sql

    Type for a record:

    create type tq84_varchar2_tab as table of varchar2(4000);
    /
    

    Type for a result set (which is an array of records):

    create type tq84_varchar2_tab_tab as table of tq84_varchar2_tab;
    /
    

    The function that does the select and returns an instance of the result set:

    create or replace function tq84_select_star_from_table(table_name in varchar2) 
        return tq84_varchar2_tab_tab
    as
        stmt_txt     varchar2(4000);
        cur          number;
        columns_desc dbms_sql.desc_tab;
        column_cnt   number;
    
        result_set   tq84_varchar2_tab_tab;
    
    begin
    
        stmt_txt := 'select * from ' || table_name;    
    
        cur := dbms_sql.open_cursor;
    
        dbms_sql.parse(cur, stmt_txt, dbms_sql.native);
        dbms_sql.describe_columns(cur, column_cnt, columns_desc);
        dbms_sql.close_cursor(cur);
    
    
        stmt_txt := 'select tq84_varchar2_tab(';
    
        for i in 1 .. column_cnt loop 
    
            if i != 1 then
               stmt_txt := stmt_txt || ',';
            end if;
    
            stmt_txt := stmt_txt || columns_desc(i).col_name;
    
        end loop;
    
        stmt_txt := stmt_txt || ') from ' || table_name;
    
    --  dbms_output.put_line(stmt_txt);
    
        execute immediate stmt_txt 
        bulk collect into result_set;
    
        return result_set;
    
    
    end tq84_select_star_from_table;
    

    The function can then be used with something like:

    declare
      records   tq84_varchar2_tab_tab;
    begin
    
      records := tq84_select_star_from_table('user_objects');
    
      for i in 1 .. records.count loop
          dbms_output.put_line (records(i)(5) || ': ' || records(i)(1));
      end loop;
    
    end;
    /
    

提交回复
热议问题