Cerca dinamicamente i nomi delle colonne per una tabella durante una query sql
Domanda
Sto scrivendo SQL (per Oracle) come:
INSERT INTO Schema1.tableA SELECT * FROM Schema2.tableA;
dove Schema1.tableA e Schema2.tableA hanno le stesse colonne. Tuttavia, sembra che questo non sia sicuro, poiché l'ordine delle colonne che ritornano in SELECT non è definito. Quello che dovrei fare è:
INSERT INTO Schema1.tableA (col1, col2, ... colN) SELECT (col1, col2, ... colN) FROM Schema2.tableA;
Lo sto facendo per molte tabelle usando alcuni script, quindi quello che mi piacerebbe fare è scrivere qualcosa del tipo:
INSERT INTO Schema1.tableA (foo(Schema1.tableA)) SELECT (foo(Schema1.tableA)) FROM Schema2.tableA;
Dove foo è una magia magica che estrae i nomi delle colonne dalla tabella uno e li impacchetta nella sintassi appropriata. Pensieri?
Soluzione
Questo PL / SQL dovrebbe farlo:
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;
/
Altri suggerimenti
Potrebbe essere necessario costruire le istruzioni insert in modo dinamico usando USER_TAB_COLUMNS ed eseguili utilizzando ESEGUI IMMEDIATO .
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow