INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

时间:2010-10-29 14:39:58

标签: oracle plsql

我想做一个INSERT / SELECT,这意味着在TARGET_TABLE中插入SOURCE_TABLE的记录,并假设:

SOURCE和TARGET表只有一个普通列的SUBSET,这意味着在示例中:

==> SOURCE TABLE有ALPHA,BETA和GAMMA列;
==> TARGET TABLE有BETA,GAMMA和DELTA专栏。

生成INSERT / SELECT语句的最有效方法是什么,尊重源表中不存在所有目标列的假设?

这个想法是PL / SQL脚本CHECKS源表和目标表中的列,进行INTERSECTION,然后生成一个带有正确列列表的动态SQL。

请假设目标表中存在但不存在于源表中的列必须保留为NULL。

我希望将SOURCE中的数据提取到一组INSERT语句中,以便以后插入到TARGET表中。

您可以假设TARGET表的列数多于SOURCE表,并且SOURCE表中的所有列都以相同的顺序出现在TARGET表中。

提前感谢您提出有用的建议!

1 个答案:

答案 0 :(得分:5)

在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的{​​{1}}变量中。然后,您可以:

common_fields