INSERT INTO TARGET_TABLE SELECT*FROM SOURCE_TABLE;

Ult*_*mit 2 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脚本检查列在源表和目标表,使得交集,然后产生具有列的正确的列表动态SQL.

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

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

你可以假设目标表具有比源表中的列多,并且,在源表中的所有列都存在于相同的顺序目标表.

提前感谢您的有用建议!

Pab*_*ruz 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'
Run Code Online (Sandbox Code Playgroud)

然后使用上述查询迭代游标,以生成以逗号分隔的所有返回值的列表.将逗号分隔的字符串放入varchar2名为的变量中common_fields.然后你可以:

sql_sentence := 'insert into TABLE_1 (' || 
                 common_fields || 
                 ') select ' || 
                 common_fields ||
                 ' from TABLE_2';
execute immediate sql_sentence;
Run Code Online (Sandbox Code Playgroud)