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は、表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;
/
他のヒント
USER_TAB_COLUMNS および即時実行。
所属していません StackOverflow