> 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は不要。