0

異なるデータ構造を持つテーブル (Oracle) に対する統合された挿入クエリについて質問があります。例を挙げて詳しく説明しましょう。

    tb_customers (
    id NUMBER(3), name VARCHAR2(40), archive_id NUMBER(3)
    )

    tb_suppliers (
    id NUMBER(3), name VARCHAR2(40), contact VARCHAR2(40), xxx, xxx, 
    archive_id NUMBER(3)
    )

すべてのテーブルに存在する唯一の列は [archive_id] です。計画は、すべてのレコードを別のデータベース パーティションにコピー (複製) し、それに応じてそれらのレコードの archive_id をインクリメントすることによって、データセットの新しいアーカイブを作成することです。[archive_id] は常に主キーの一部です。

私の問題は、データの実際の複製を行う select ステートメントにあります。列は可変であるため、データをコピーして archive_id を更新する統一された select ステートメントを考え出すのに苦労しています。

1 つの解決策 (うまくいく) は、ストアド プロシージャ内のすべてのテーブルを反復処理し、次のことを行うことです。

CREATE TABLE temp as (SELECT * from ORIGINAL_TABLE);
UPDATE temp SET archive_id=something;
INSERT INTO ORIGINAL_TABLE (select * from temp);
DROP TABLE temp;

DDLコマンドはすべての復元ポイントを台無しにするため、このソリューションはあまり好きではありません.

他に解決策はありますか?

4

2 に答える 2

0

ベーステーブルごとにグローバル一時テーブルを作成するのはどうですか?

create global temporary table tb_customers$ as select * from tb_customers;
create global temporary table tb_suppliers$ as select * from tb_suppliers;

これらを毎回作成して削除する必要はなく、そのままにしておいてください。

アーカイブプロセスは単一のトランザクションです...

insert into tb_customers$ as select * from tb_customers;
update tb_customers$ set archive_id = :v_new_archive_id;
insert into tb_customers select * from tb_customers$;

insert into tb_suppliers$ as select * from tb_suppliers;
update tb_suppliers$ set archive_id = :v_new_archive_id;
insert into tb_suppliers select * from tb_suppliers$;

commit; -- this will clear the global temporary tables

お役に立てれば。

于 2010-04-23T08:31:30.767 に答える
0

すべてのテーブルに対して単一の sql ステートメントを使用するのではなく、単に使用して挿入することをお勧めします。

insert into tb_customers_2 
    select id, name, 'new_archive_id' from tb_customers;
insert into tb_suppliers_2 
    select id, name, contact, xxx, xxx, 'new_archive_id' from tb_suppliers;

または、それらすべてに対して単一のSQLステートメントが本当に必要な場合は、少なくともすべての一時テーブルを(一時テーブルとして)事前に作成し、次回のためにそのままにしておきます。次に、動的SQLを使用して一時テーブルを参照します。

insert into ORIGINAL_TABLE_TEMP (SELECT * from ORIGINAL_TABLE);
UPDATE ORIGINAL_TABLE_TEMP SET archive_id=something;
INSERT INTO NEW_TABLE (select * from ORIGINAL_TABLE_TEMP);
于 2010-04-23T17:05:17.703 に答える