- ベストアンサー
oracleデータのインポート&エクスポートについて
oracleデータをインポートするにはSQL*LOADERを使用するのが一般的な方法の一つですが、 同じように、その逆であるエクスポートを行う場合はどのような手段を用いますか? 条件としては ・バッチ(シェル)で実行できる事。 ・SQL*LOADERでインポートする為のデータと互換性のあるフォーマット(CSV)である事。 ・ツールの追加購入は考えていません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
最初に「データだけの移動」だという前提で。 データの抽出はSQLで抽出した結果をスプールすれば良いだけだと思います。 項目をシングルコーテーションで括るなどはSQLで編集してやる必要がありますがSQL*PLUSで十分事足りると思います。 それよりもインポート/エクスポートユーティリティを使った方がはるかに簡単だと思うですが如何ですか?
その他の回答 (3)
- gudu_guda
- ベストアンサー率55% (5/9)
そもそもインポート/エクスポートユーティリティはデータの単純な移行という目的では作られておりませんので >CSVや固定長データとしてデータのみを入出力する機能は無いという事でしょうか? というご質問に関しては「そうです」となります。 また、ビューはエクスポート元にはなれないので、ご検討中の方法も難しいと思います。(Viewも単純にSelect文ですので) 複雑な物理定義変更などを網羅できるような付属ツールは、少なくとも私は知りません。 単純なデータ移行なら、と思い回答させて頂きましたが、補足にあるような構成変更に関してはPL*SQLもしくはPRO*Cでの作りこみが必要になると思います。 データ加工をPL*SQLでやって、構成変更後のデータにあわせてCSVデータを作成してSQL*LOADERでロードという手順か、旧テーブルからSELECTしつつ新テーブルにINSERTするようなAPを作成する様になると思います。 もしくは補足にあるように変更後のフォーマットのViewを作成して、そのViewからCSVを作成するかですね。ロジックを入れない分シンプルになるのではないでしょうか。 ご参考までにOTN(ORACLE TECHNOLOGY NETWORK)のURLを載せて置きます。
- 参考URL:
- http://otn.oracle.co.jp/
お礼
いくつかの方向性が見えました。 ありがとう御座いました。
- gudu_guda
- ベストアンサー率55% (5/9)
訂正です。 【誤】 INSERT INTO NEWTABLE_A (ITEM_A,ITEM_B,ITEM_C) AS SELECT ITEM_A,'000000',ITEM_C FROM TABLE_A; 【正】 INSERT INTO NEWTABLE_A (ITEM_A,ITEM_B,ITEM_C) SELECT ITEM_A,'000000',ITEM_C FROM TABLE_A;
- gudu_guda
- ベストアンサー率55% (5/9)
テーブルの構成が変わってしまう場合はインポート/エクスポートは使用できないと記憶しております。 なので、補足の様な場合はSQLでINSERT SELECTしてやれば楽ではないでしょうか。 (1)新テーブル作成 (2)旧テーブルからINSERT SELECT文でデータ移行 SQL例) INSERT INTO NEWTABLE_A (ITEM_A,ITEM_B,ITEM_C) AS SELECT ITEM_A,'000000',ITEM_C FROM TABLE_A; (3)旧テーブルドロップ。 ビューは元テーブルがドロップされた時点で使えなくなりますので、ビューを使ってのデータ移行は不可能だと思います。 一時的にテーブルを作成するのが不可であれば、SQLでCSV形式にしたSELECTを実行して、SQL*LOADERでデータ投入する方法になると思います。
補足
ありがとうございます。 インポート、エクスポートにはテーブルやその他のオブジェクトを特殊な形式でエクスポートし、 その形式のものをインポートする昨日はあるが、 CSVや固定長データとしてデータのみを入出力する機能は無いという事でしょうか? VEIWを作成してその形でデータだけ抜いて、同じ型のTABLEに入れようと考えたのですが、そのような事は不可能で、VEIWをエクスポートしたもVEIWそのものがオブジェクトとして退避されるだけ? 例では簡単なテーブル変更例を示しましたが、 実際はもっと複雑な用件が絡み、 複数のテーブルから1つのテーブルにしたり、 逆に1つのテーブルから複数のテーブルを切り出して親子関係にしたり、 複数のテーブル群から複数のテーブル群へややこしい変換があります。 ですので、可能なら完成系をVIEWで一旦作成し、 そのままデータだけをエクスポートし、 テーブルを全部削除&再作成し、 退けたデータを戻す。 といった感じがシンプルで良いかと思ったのですが、 無理なのですか? やはり、そういう場合は PL/SQLでCSVファイルを出力するスクリプト作って、 SQL*LOADERで流し込むしかないのでしょうか?
補足
早速ありがとうございます。 <TBLE_A> ITEM_1 ITEM_2 ------ ------ AAAAAA 000000 AAAAAA 111111 BBBBBB 222222 CCCCCC 333333 上記のようなテーブル TBLE_Aがあったとして、それをアイテム名変更を含んだ変更をするとします。 <新TBLE_A> ITEM_A ITEM_B ITEM_C ------ ------ ------ AAAAAA 000000 000000 AAAAAA 000000 111111 BBBBBB 000000 222222 CCCCCC 000000 333333 変更後のテーブルの条件が以下とします。 ITEM_A…ITEM_1のリネーム ITEM_B…新規項目で内容はオールゼロ ITEM_C…ITEM_2のリネーム このような場合にもインポート/エクスポートユーティリティは有効でしょうか? 一旦、上記<新TBLE_A>と同じ内容のVIEW<VIEW_A>を作ったとします。 <VIEW_A> ITEM_A ITEM_B ITEM_C ------ ------ ------ AAAAAA 000000 000000 AAAAAA 000000 111111 BBBBBB 000000 222222 CCCCCC 000000 333333 CREATE OR REPLACE VIEW VIEW_A (ITEM_A,ITEM_B,ITEM_C) AS SELECT "ITEM_1" ,"000000" ,"ITEM_2" FROM TBLE_A / このVIEW_Aからデータをエクスポートし、 TBLE_AをDELETE & CREATEした後、インポートするという事は可能ですか? あるいは、もっといい方法はありますか?