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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top