INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE; - PullRequest
2 голосов
/ 29 октября 2010

Я хотел бы сделать INSERT / SELECT, это означает INSERT в TARGET_TABLE записи SOURCE_TABLE, с этим предположением:

ИСТОЧНИК и таблица TARGET имеют только ПОДПИСЬ общих столбцов, это означает в примере:

==> ТАБЛИЦА ИСТОЧНИКОВ имеет столбцы ALPHA, BETA и GAMMA;
==> TARGET TABLE имеет столбцы BETA, GAMMA и DELTA.

Каков наиболее эффективный способ создания операторов INSERT / SELECT с учетом предположения о том, что не все целевые столбцы присутствуют в исходной таблице?

Идея состоит в том, что сценарий PL / SQL ПРОВЕРЯЕТ столбцы в исходной таблице и в целевой таблице, выполняет ПЕРЕКЛЮЧЕНИЕ, а затем создает динамический SQL с правильным списком столбцов.

Предположим, что столбцы, присутствующие в целевой таблице, но не присутствующие в исходной таблице, должны быть оставлены в NULL.

Я хочу извлечь данные из SOURCE в набор операторов INSERT для последующей вставки в таблицу TARGET.

Можно предположить, что таблица TARGET имеет больше столбцов, чем таблица SOURCE, и что все столбцы таблицы SOURCE присутствуют в таблице TARGET в том же порядке.

Заранее благодарю за полезные советы!

1 Ответ

5 голосов
/ 29 октября 2010

В Oracle вы можете получить общие столбцы с этим SQL-запросом:

select column_name
  from user_tab_columns
 where table_name = 'TABLE_1'
intersect
select column_name
  from user_tab_columns
 where table_name = 'TABLE_2'

Затем вы итерируете курсор с указанным запросом, чтобы создать разделенный запятыми список всех возвращаемых значений.Поместите эту строку через запятую в переменную varchar2 с именем common_fields.Затем вы можете:

sql_sentence := 'insert into TABLE_1 (' || 
                 common_fields || 
                 ') select ' || 
                 common_fields ||
                 ' from TABLE_2';
execute immediate sql_sentence;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...