nachschlagen Spaltennamen dynamisch für eine Tabelle, während in einer SQL-Abfrage
Frage
Ich schreibe SQL (für Oracle) wie:
INSERT INTO Schema1.tableA SELECT * FROM Schema2.tableA;
wo Schema1.tableA und Schema2.tableA die gleichen Spalten haben. Allerdings scheint es so unsicher ist, da die Reihenfolge der Spalten zurück in der SELECT kommen nicht definiert ist. Was soll ich tun, ist:
INSERT INTO Schema1.tableA (col1, col2, ... colN) SELECT (col1, col2, ... colN) FROM Schema2.tableA;
Ich tue dies für viele Tabellen einige Skripte verwenden, was so würde ich schreib tun so etwas wie:
INSERT INTO Schema1.tableA (foo(Schema1.tableA)) SELECT (foo(Schema1.tableA)) FROM Schema2.tableA;
Wo foo ist einige nette Magie, die die Spaltennamen aus der Tabelle extrahiert ein und verpackt sie in der entsprechenden Syntax. Gedanken?
Lösung
Das PL / SQL sollte es tun:
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;
/
Andere Tipps
Sie müssen möglicherweise die Insert-Anweisungen dynamisch mit USER_TAB_COLUMNS und führen sie mit einem