我正在编写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是一些漂亮的魔术,它从表1中提取列名并以适当的语法打包它们.思考?
这个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; /