Отключить adblock

Adblock блокирует некоторый контент на сайте

ADBlock errore

Динамический поиск имен столбцов для таблицы во время запроса SQL

StackOverflow https://stackoverflow.com/questions/205950
 Проверял

Вопрос

Я пишу SQL (для Oracle) как:

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 - это изящное волшебство, которое извлекает имена столбцов из первой таблицы и упаковывает их в соответствующий синтаксис. Мысли?

Решение

Этот 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;
/

Другие советы

Вам может понадобиться динамически создавать операторы вставки, используя USER_TAB_COLUMNS и выполните их, используя ВЫПОЛНИТЬ НЕМЕДЛЕННО .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow