• ベストアンサー

SQL-LOADERについて

SQL-LOADERで質問があります。 あるファイルをSQL-LOADERで取り込もうとしたとき、先頭の1バイトが'1'の場合Aテーブルに、'2'の場合Bテーブルにinsertさせることは可能でしょうか? ご存知の方がいましたら、教えてください

  • Oracle
  • 回答数3
  • ありがとう数11

質問者が選んだベストアンサー

  • ベストアンサー
  • bardfish
  • ベストアンサー率28% (5029/17765)
回答No.1

SQL*Loaderにそのような振り分け機能はありません。 おっしゃっているようなことを実現するためには、SQL_Loaderで読み込ませるファイルを作成するときに複数に分けることです。 つまり、 先頭の1バイトが'1'のA.txt 先頭の1バイトが'2'のB.txt それぞれを読み込むSQL*Loaderのバッチを作成すればOKです。

kiyoabc
質問者

お礼

早速の回答、ありがとうございます。 不可能ということで、、、非常に残念です、、、 明細部データの総件数と、トレーラ部にある件数が一致しているかどうかチェックしたかったのですが、、、、 二度SQL-LOADERを回すしかなさそうですね。 ありがとうございました。

その他の回答 (2)

  • DK10410
  • ベストアンサー率50% (2/4)
回答No.3

やりたいことを考慮するとSQL*Loaderよりは、UTL_FILEを使用してP/LSQLブロックもしくはProcedureで処理したほうが、Insertと同時に処理中にカウントや集計処理ができ、チェックもできるのでいいような気がしますが・・

kiyoabc
質問者

補足

ご回答ありがとうございます。 DK10410さんのおっしゃるとおりPL-SQLでやるほうがいろいろ出来るのですが、今回データ件数が200万件と多いため、SQL-LOADERで考えてみました。 ありがとうございました。

回答No.2

インサート先を作業用のテーブルにして、そのテーブルにインサートトリガを仕掛け、 2つのテーブルに振り分けることは可能です。(出来なくはないという意味ですが) ですが、2回の実行で問題ないのでしたら、#1で書かれているように対応するのが 合理的な解決です。

kiyoabc
質問者

お礼

ご回答ありがとうございます。 なるほど、トリガーを用意すれば確かに出来そうですね。 結局2回の実行での方向で考えてます。 時間は倍かかってしまうのが残念ですが、、、 ありがとうございました。

関連するQ&A

  • SQL-LOADERの逆のもの

    先日SQL-LOADERについて質問させてもらいましたが、もう1つ教えて欲しいことがあります。 SQL-LOADERの逆のものはないのでしょうか? 200万件のテーブルのデータを、条件毎に高速エクスポート(固定長テキスト)したいのですが。 つまりSQL-WRITERというものは無いかな~、、、と、、、(笑) 最悪、PL/SQLで200万件をまわして、テキスト出力させようと思っていますが、多分時間が相当かかると思うので、、、、 なにか良い方法があったら教えてください。

  • SQL*LoaderでCSVから指定した列のみインポートしたい。

    SQL*Loaderを用いてOracleのテーブルにデータを格納 しようと思っています。 格納するデータはカンマ区切りのCSVファイルです。 入力CSVファイルは他テーブル用のファイルなので、 ローダーで落とし込むテーブルとは列数が異なります。 ですので、「CSVの5列目の値をテーブルのAA_NOというフィールドに 格納する。ということが可能なのでしょうか?」 CSVファイルのある行が a,b,c,d,e,f というデータの場合、テーブルには a,e,f とインポートしたいのです。 よろしくお願いします。

  • SQL-Loaderが動かないです。

    みなさんこんにちは 作成されたデータをSQL-Loaderにてオラクルデータベースに取込み を行います。 下記にソースを書きましたが、まずTEST.batファイルを実行し、 TEST.bat側からTEST.ctlを実行し、TEST_WORKテーブルにデータを 格納します。 *****TEST.batの内容***** SQLLDR USERID=TEST1/TEST1@GUEST CONTROL=TEST.ctl LOG=LOG.txt ************************ *****TEST.ctlの内容***** LOAD DATA INFILE 'D:\test1.dat' TRUNCATE PRESERVE BLANKS INTO TABLE TEST_WORK FIELDS TERMINATED BY "|" TRAILING NULLCOLS (KOUMOKU1, KOUMOKU2, KOUMOKU3, KOUMOKU4) ************************ 実際にこれを実行した所、問題なく正常終了しました。 しかし、これをホスト側からFTPにて実行を行うと、 TEST.batが実行されません。もちろんログも出力されません。 ファイルが実行できてないので、ファイルのコピーを行う簡単 なバッチファイルを作成し、ホスト側から実行を行ってもらった 場合、こちらは問題ありませんでした。 となると、SQL-Loaderのソースに何か問題があるのでは?と 思いますが・・・色んなサイトでLoaderのソースを拝見しましたが、 見当がつかないです。 ソースを見て、気になる点や、同じ経験をされた方いらっしゃい ましたら、お知恵をお貸しください。 ちなみに、SQL-Loaderを実行するマシンのOSはWindows2000Proです。 よろしくお願いします。

  • SQL*LoaderとInsertの違いについて

    大量データを扱う場合、下記2通りの方法がある事を知りました。どちらが大量データの書き込み処理が早いのでしょうか? (1)SQL*Loaderのダイレクト・パス・ロード (2)insert /*+ append */ によるダイレクト・パス・インサート また、通常のINSERTと比べてどれ位時間短縮されるものか事例等ありましたら目安として教えて下さい。

  • SQL*Loaderで「オブジェクトが存在しない」というエラーが出ます

    SQL*Loaderでデータをインサートしたいのですが、 オブジェクトがあるのに、 「SQL*Loader-941: 表~の記述中にエラーが発生しました。 ORA-04043: オブジェクト~は存在しません。」というエラーが出力されます。 何が原因なのでしょうか? すみませんが教えて下さい!お願いします!

  • SQLでできますか?

    SQLでできますか? INSERT INTO test (A) VALUES (B)というSQLを発行したいのですが、このSQLのVALUESのBにあたる部分を正規表現的に指定して、一度のクエリで以下のような結果を得たいのです。 1.テーブルhogeのpiyoカラムの値の先頭がappleになっている行を探す。 2.(1.)で抽出した行のidの値をBとする。 例えば、以下のようにです。 ■皆様が回答してくださるSQL文(1クエリで行いたい) ???????????? ■皆様が回答してくださるSQL文と同等の意味を持つSQL群 INSERT INTO test (A) VALUES (100) INSERT INTO test (A) VALUES (101) INSERT INTO test (A) VALUES (102) ■テーブルhoge _____id_____piyo__________created 1. 100 applebanana 2009/01/02 2. 101 apple_12345 2009/01/03 3. 102 appleXXXXXX 2009/01/04 4. 103 bananananan 2009/01/05 5. 104 ringogogogo 2009/01/06 分かりにくい説明ですが、お詳しい方、どうかご回答の程を宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • SQL*Loader Append

    SQL*Loaderのコントロールファイル内のパラメータ設定についてですが、 ネットで調べた結果 ロード方法をAPPENDとすると既存データがある場合は新しい行として追加とあるのですが、 これはテーブルのPKが重複していても新しく行がついかされるということでしょうか? 逆にREPLACEはPKが重複しているデータに上書きされるということでしょうか? よろしくお願いいたします。

  • SQL*Loaderについて2

    SQL*Loaderを用いてOracleのテーブルにデータを格納しようと思っています。 格納するデータはテキストファイルです。 テキストファイルのデータはカンマ区切りになっているのですが、エラーとなってしまいます。 このテキストファイルをタブ区切りにすれば問題なく動くのですが、カンマ区切りでは無理 なのでしょうか? 現在作成のLoaderは下記になっています。 load data truncate into table DEPT fields terminated by X'09' trailing nullcols (DEPTNO ,POSTNO NULLIF POSTNO=BLANKS ,SAL NULLIF SAL=BLANKS ) 現在のデータは下記になっています。 1001,1234567,100000 1002,1234567,200000

  • データ削除とSQL*Loaderでのインポート

    SQL*Loaderを使ってデータをインポートするのですが、既存データが存在するテーブルにインポートするため、実行前に、条件に一致する一部のデータを削除します。 ですが、SQL*Loaderでインポートが失敗した際には、元に戻したいと思っています。 そういう場合に、SQL*PlusからDELETEのSQL文を実行してから、SQL*Loaderを起動してインポートするとなると、SQL*Plusから抜けた時点でCOMMITされてしまいますよね?そのためSQL*LoaderでインポートがエラーになってROLLBACKされても、削除されたデータは元に戻らないですよね・・・。 全件削除なら、CTLファイル内でREPLACEを指定してインポートするのですが・・・ データの一部削除とSQL*Loaderでのインポートを一連の処理として、エラーの際にはROLLBACKさせられる方法はありますでしょうか? よろしくお願いします。

  • SQL*Loaderでのデータロード

    SQL*Loaderでデータロードを実行するとき ロードするテキストファイルのある列の部分が スペースのとき、テーブルで設定したデフォルト値 をロードさせたいのですが、どうCTLファイルで記述 すればよいのですか? 教えてください。おねがいします。