Динамический поиск имен столбцов таблицы во время запроса sql.
Вопрос
Я пишу 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 и выполнить их, используя ВЫПОЛНИТЬ НЕМЕДЛЕННО.
Не связан с StackOverflow