> Q.テスト用の環境で、ユーザA、Bが存在し、これらはテストの

> 種別によって使い分けています。
> また、それぞれのユーザは、同じ定義のテーブルを所有してますが、
> テーブルの名称のみ異なっています。
> ユーザAのテーブルにはデータが入っており、

> ユーザBのテーブルは空です。
> ユーザAのデータを、ユーザBのテーブルに入れる方法を教えて下さい。


まず、この質問を貰った時に、
「スキーマが別なんだから、テーブルは同じ名称で良いじゃん」

と思いました。

だって、同じアプリを使用しているのだから、アプリの修正が大変でしょう。
スキーマが違うだけだったら、接続の箇所だけの変更で良いのに・・・


当初の設計方針の問題なのか、色々と理由があるようでしたが、
ここでは割愛しておきます。


さて、質問の実現方法ですが、2つの方法が思い浮かびました。



1.insert ・・・ select 文 の使用


DBA権限を持つユーザ(両方のテーブルの操作が可能なので)
で以下の文を実行。

もし、DBA権限を持つユーザで接続できないのであれば、
一時的にオブジェクト権限を付与する事。


SQL> insert into B.テーブル名 select * from A.テーブル名;
SQL> commit;


大量のデータの場合、以下のようにAPPENDヒントを使った方が
速いかもしれません。


SQL> insert /*+ APPEND */ into B.テーブル名 select * from A.テーブル名;
SQL> commit;


時間測定の一番簡単な方法は、以下のコマンドで出来る。


SQL> set timing on



2.exp/impの方法


既に、別名で同定義の表が存在しているので、
1の方法で良いと思いますが、もう一つ方法を載せておきます。

流れは以下の通り


(1)Aのテーブルをexpし、Bにimp(fromuser、touserを使用)

$ exp user/pass ・・・
$ imp user/pass fromuser=A touser=B ・・・


(2)BにimpしたオブジェクトをRENAMEする。


SQL> alter table 旧テーブル名 rename to 新テーブル名;

ちなみにインデックスの名称も必要であれば変更できます。

SQL> alter index 現インデックス名 rename to 新インデックス名;

※最初に書いたように、別スキーマで同名テーブルであれば、
当然、RENAMEは不要。