2008-10-15 7 views
1

J'écris SQL (pour Oracle) comme:regard Dynamiquement les noms de colonnes d'un tableau alors que dans une requête SQL

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

où Schema1.tableA et Schema2.tableA ont les mêmes colonnes. Cependant, il semble que ce soit dangereux car l'ordre des colonnes qui reviennent dans le SELECT n'est pas défini. Ce que je dois faire est:

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

Je fais cela pour beaucoup de tables à l'aide de quelques scripts, donc ce que je voudrais faire est d'é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 colonnes de la table un et les empaquette dans la syntaxe appropriée. Pensées?

Répondre

5

Cette 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; 
/
Questions connexes