Question

J'écris en SQL (pour Oracle) comme:

INSERT INTO Schema1.tableA SELECT * FROM Schema2.tableA;

où Schema1.tableA et Schema2.tableA ont les mêmes colonnes. Cependant, il semble que cela ne soit pas sûr, car l'ordre des colonnes renvoyées dans le SELECT est indéfini. Ce que je devrais faire, c'est:

INSERT INTO Schema1.tableA (col1, col2, ... colN) 
SELECT (col1, col2, ... colN) FROM Schema2.tableA;

Je fais ceci pour beaucoup de tables en utilisant des scripts, donc ce que j'aimerais faire, c'est écrire quelque chose comme:

INSERT INTO Schema1.tableA (foo(Schema1.tableA)) 
SELECT (foo(Schema1.tableA)) FROM Schema2.tableA;

Où foo est une magie astucieuse qui extrait les noms de colonne de la première table et les empaquete dans la syntaxe appropriée. Des pensées?

Était-ce utile?

La solution

Ce PL / SQL devrait le faire:

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;
/

Autres conseils

Vous devrez peut-être construire les instructions d'insertion de manière dynamique à l'aide de USER_TAB_COLUMNS et exécutez-les à l'aide de EXECUTE IMMEDIATE .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top