Oracle
 sql >> Baza danych >  >> RDS >> Oracle

WYKONAJ NATYCHMIAST w plsql

Jeśli naprawdę trzeba select * from dynamiczna nazwa tabeli , to prawdopodobnie wybrałbym dbms_sql

Wpisz rekord :

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

Wpisz zestaw wyników (który jest tablicą rekordów ):

create type tq84_varchar2_tab_tab as table of tq84_varchar2_tab;
/

Funkcja dokonująca wyboru i zwracająca instancję zestawu wyników :

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;

Funkcja może być następnie używana z czymś takim jak:

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;
/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy istnieje dobra alternatywa dla SQL*PLUS dla Oracle?

  2. Utwórz operator zdefiniowany przez użytkownika z lewą/prawą stroną

  3. Buforowanie sekwencji Oracle

  4. Oracle Spool — brak pełnych informacji

  5. Jak ustawić Incemental na true dla wielu tabel z tym samym właścicielem przy użyciu DBMS_STATS.set_table_prefs?