- ベストアンサー
既にテーブルが存在する場合のインポート
インポート対象のテーブルが既に存在する場合、次のエラーが発生します。 IMP-00015: オブジェクトがすでに存在するため次の文は失敗しました: "CREATE TABLE ... SQL Loaderではデータにスペースや改行が含まれているとdatの作成がめんどうですし、dmpファイルでcreate文を削除するようなこともできればしたくありません。 データを追記したいのでテーブルを削除せずにインポートしたいのですが、どうすればよいでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
参考URLの内容はどうでしょうか?
その他の回答 (3)
- OkinawaDream
- ベストアンサー率54% (6/11)
temporaryのユーザーを経由して、データを入れてはどうでしょうか? 例えば、ユーザーA、テーブルXにデータを入れたい場合、一度temporaryのユーザーBを作成し、ユーザーBに対してimpします。この状態で、 insert into ユーザーA.テーブルX ( select * from ユーザーB.テーブルX) とすれば、データが追記できると思います。
お礼
回答ありがとうございます。 #1の回答"オプションignore=yを指定する"で解決しました。 場合によってはご指摘の方法がよい場合もありそうですね。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
基本的に、#1で案内された方法で、OKです。(IGNORE=Y) 既存オブジェクトにデータを追加してくれます。 ただし、エラーがあっても継続処理する都合上、 予定しないエラーがないことを確認しないと痛い目に あいますので、ご注意あれ。 #2で書かれていることは、オラクルユーザ的に理解不能です。 一般論としては良いと思いますが、IMP-00015の回避策が話題なので、 インポートユーティリティを知らずして、”自信あり”はちょっと。
お礼
回答ありがとうございます。 directの場合には特に注意します。
- chie65536
- ベストアンサー率41% (2512/6032)
SQLの「CREATE TABLE」文は「新規にテーブルを作成する命令」なのですが、そこを理解出来てますか? インポート先が既存なのに「CREATE TABLE」したら「テーブル(オブジェクト)がすでに存在する」って言われるのは当たり前です。 たぶん、食わせたSQLファイルが「テーブルが存在しない状態の時に、新しくテーブルを作ってから、インポートを行う」と言う複数のステートメントをまとめたSQLファイルの筈です。 そこから「新しくテーブルを作ってから」の文を削除し「インポートを行う」だけ残し、別名でSQLファイルを保存して、それを使いましょう。 それと、既存テーブルにデータをインポートして追加する場合、既存データとインポートデータの主キーが衝突するとエラーになるので、その辺りの処理も追加しなければダメだと思います。 大元のSQLファイルを使って処理していた場所は「テーブルを新たに作ってインポート」をしていて、主キーが衝突しない前提で作られている筈で、その辺りのエラー処理が無い筈なので。 他人が作ったプログラムやシステムを流用して処理を追加するのは、とても大変な作業だと思います。頑張って下さい。
お礼
丁寧なご説明ありがとうございます。 oracle utility / import を使用していますので、言葉が足りませんでしたね。 なお#1の回答"オプションignore=yを指定する"で解決しました。
お礼
まさにこのことでした。マニュアルが読み足りませんでしたね。ありがとうございます。