2008-10-15 60 views
1

我在寫SQL(甲骨文),如:動態查找列名的表,而在一個SQL查詢

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

其中Schema1.tableA和Schema2.tableA具有相同的列。但是,這似乎是不安全的,因爲在SELECT中返回的列的順序是未定義的。我應該做的是:

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

我這樣做是爲大量使用一些腳本表,所以我想要做的是寫類似:其中foo是

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

一些漂亮的魔法,從表1中提取列名並將它們打包爲適當的語法。思考?

回答

5

這PL/SQL應該這樣做:

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