2008-10-15 2 views
1

Я пишу SQL (для Oracle), как:Динамически посмотреть имена столбцов для таблицы в SQL-запросе

 
INSERT INTO Schema1.tableA SELECT * FROM Schema2.tableA; 

где Schema1.tableA и Schema2.tableA имеют одинаковые столбцы. Однако кажется, что это небезопасно, так как порядок столбцов, возвращаемых в SELECT, не определен. То, что я должен делать это:

 
INSERT INTO Schema1.tableA (col1, col2, ... colN) 
SELECT (col1, col2, ... colN) FROM Schema2.tableA; 

Я делаю это для многих таблиц, используя несколько сценариев, так что я хотел бы сделать, это написать что-то вроде:

 
INSERT INTO Schema1.tableA (foo(Schema1.tableA)) 
SELECT (foo(Schema1.tableA)) FROM Schema2.tableA; 

Где Foo является отличная магия, которая извлекает имена столбцов из первой и упаковывает их в соответствующий синтаксис. Мысли?

ответ

5

Это PL/SQL должен это сделать:

declare 
    l_cols long; 
    l_sql long; 
begin 
    for r in (select column_name from all_tab_columns 
       where table_name = 'TABLEA' 
       and owner = 'SCHEMA1' 
      ) 
    loop 
     l_cols := l_cols || ',' || r.column_name; 
    end loop; 

    -- Remove leading comma 
    l_cols := substr(l_cols, 2); 

    l_sql := 'insert into schema1.tableA (' || l_cols || ') select ' 
      || l_cols || ' from schema2.tableA'; 

    execute immediate l_sql; 

end; 
/
1

Возможно, вам потребуется построить инструкции вставки динамически, используя USER_TAB_COLUMNS и выполнить их с использованием EXECUTE IMMEDIATE.

Смежные вопросы