1

次のようなSQL(Oracle用)を書いています:

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;

私はいくつかのスクリプトを使用して多くのテーブルに対してこれを行っているので、次のようなものを書きたいと思います:

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

foo は、テーブル 1 から列名を抽出し、適切な構文でパッケージ化する気の利いた魔法です。考え?

4

2 に答える 2

6

この 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;
/
于 2008-10-15T19:35:21.493 に答える
1

USER_TAB_COLUMNSを使用して挿入ステートメントを動的に構築し、 EXECUTE IMMEDIATEを使用してそれらを実行する必要がある場合があります。

于 2008-10-15T18:58:02.723 に答える