• ベストアンサー

SQL-LOADERの逆のもの

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

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

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

  • ベストアンサー
回答No.4

件数が多い場合、この辺の製品なんかどうでしょうか? #私は購入したこと無いですがトライアル版でも使用してみては #いかがでしょうか? http://www.ashisuto.co.jp/prod/fuo/sum/index.html

kiyoabc
質問者

補足

これはすばらしいですね!!! どうしてもダメそうだったら、この製品の購入も考えようと思います。 まずはトライアル版でテストしてみます。 ありがとうございました。

その他の回答 (4)

回答No.5

以前、PERL+DBD-ORACLEの環境で自作しましたが、そんなに遅くなかったですよ。 アプリケーションとしては、為すべき事が少ないので、処理に要する時間は、 オラクルエンジン上の処理時間に左右されます。 レコード長次第ですが、サーバ上で動かすなら、数分で終わるように思いますけどね。

kiyoabc
質問者

お礼

サーバ上で動かすと、数分で終わるのですか? 250バイトのレコード長なんですが、、、、 数分で終わるようだったら、すごくうれしいです。 ありがとうございました。

  • thatsthat
  • ベストアンサー率55% (15/27)
回答No.3

私も通常はsqlplusでやってます。 内容かぶりますが、 no1さんのリンク先で少し迷ったので、一応書いておきます(^^; sqlldrで下のようなsetの後、spoolしつつ、select文を実行します。 set colsep ',' set pagesize 0 set trimspool on set linesize 4096 colsepはカンマ区切りの例ですが、 タブの方がデータ中に含まれにくいので、タブ区切りの方が安心かも知れません。 linesizeの値も例です。充分大きな長さを指定します。

kiyoabc
質問者

お礼

ご回答ありがとうございます。 spoolって初めてなので、とても助かります。 1行が250バイトの200万件データ(500M)なんですが、spoolでどの程度の時間がかかるかやってみようと思います。 ありがとうございました。

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

SQL*WriterみたいなものはExportユーティリティしかないですね^^; 私なら、ExcelかAccess、VisualBasicを使ってプログラムを組みます。 でも、たしか↓のページで、SQL*Plusだけで固定長テキストでSELECTの結果を出力するというTipsが載っていたと記憶しています。 http://www.tmpgenc.net/ja/j_main.html http://www.mars.dti.ne.jp/~o-shin/new/kowaza/ 探してみてください(汗; Oracleのマニュアルはありませんか?暇な時に目を通しておくとかなり勉強になりますよ。 また、OracleのサイトからPDF形式でマニュアルがダウンロードできるはずです。印刷するととんでもない量になりますが、マニュアルはどんな形式であれ手元においておくことをお奨めします。

kiyoabc
質問者

お礼

なるほど、、、、 これは役にたちそうなサイトですね。 ORACLEのマニュアルは、入手しようと思います。 ありがとうございました。

関連するQ&A

  • 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を用いてOracleのテーブルにデータを格納 しようと思っています。 格納するデータはテキストファイルです。 しかし、NUMBER型にマイナスのデータ(-123.45)を格納 するとエラーになってしまいます。 原因としては、多分テキストデータの表示が"123.45-"と なっているからだと思います。 "123.45-"の表示でエラーとならずに"-123.45"と格納 されるようにすることは不可能なのでしょうか? 現在作成のLoaderは下記になっています。 load data truncate into table DEPT fields terminated by X'09' trailing nullcols (DEPTNO ,POSTNO NULLIF POSTNO=BLANKS ,SAL NULLIF SAL=BLANKS ) ちなみにSALがNUMBER型の項目です。

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

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

  • SQL*Loader Append

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

  • データ削除と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にてオラクルデータベースに取込み を行います。 下記にソースを書きましたが、まず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です。 よろしくお願いします。

  • 現在、VBAにてUNICODEのCSVを出力し、SQL*Loaderで

    現在、VBAにてUNICODEのCSVを出力し、SQL*Loaderでテーブルへ取り込む処理を作成しています。 そこで、文字コードについて質問があります。 作成したCSVで、IBMフォーマットの全角マイナスとWindowsの全角マイナスが あります。これをSql*Loaderにてテーブルへ取り込むと、Windowsの全角マイナスが IBMの全角マイナスへ変換されてしまいます。 これはSql*Loaderの仕様でしょうか? IBMの文字コードは、E28892(&H2212)、Windowsの文字コードは、EFBC8D(&HFF0D)です。 Sql*LoaderのCONTROLファイルでCHARACTERSETをUTF16にしています。 宜しくお願いします。

  • SQLからデータのDL

     SQLサーバからブラウザを介し、外部出力したいと思います。  少ないデータでしたら、「SqlDataSource」から「SPREAD」にデータを渡した後、エクスポートできたのですが、大量のデータ「120列*5000件」だと、流石に無理があります。  出来るだけ軽く外部出力(テキスト形式。出来ればエクセル形式)する方法があるでしょうか?

  • ある条件でのSQLの取得方法について

    以下の条件でのSQLのデータの取得方法が分かりません。 2つのテーブルがあるとします。 ・テーブルA キー   項目1 10     X 20     Y ・テーブルB キー  項目2  項目3 10     5    C 10     6    D 12     6    E ここで取得する条件として ■テーブルAにあるのは、必ず取得します。 ■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は  別レコードとして取得します。 ■テーブルAのキー1つに対して、テーブルBのキーは無いかも知れないし、  複数件あるかも知れません。  無い場合はテーブルAの情報のみを出力し、複数件ある場合はその全てを出力します。 ■テーブルBの項目2が同じ値のデータがある場合、テーブルBを出力したレコードと  同じレコードに、項目2が同じデータの情報を出力します。  項目2が同じデータが無い場合はこの情報は出力しません。  項目2が同じ値のデータは最大2件しかありません。 上記の例の場合に出力したい結果 ・出力テーブルC キー  フラグ   項目1  項目2  項目3   項目2が同じキー  項目2が同じ値 10  テーブルA   X 10  テーブルB         5    C 10  テーブルB         6    D        12            E 20  テーブルA   Y (テーブルC のフラグとは、テーブルAの情報かテーブルBの情報かを示します) これを出来ればSQL、出来なければPL/SQLで取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?

  • SQLの検索条件について教えてください

    PL/SQLを使い始めた初心者です。 Oracleのバージョンは9iです。 検索時の条件の設定について教えてください。 例えば、2つテーブルがあるとします。 Aテーブル.TESTNoA ------------- 11111 22222 33333 44444 55555 Bテーブル.TESTNoB ------------- 11111 33333 55555 SQL発行時、 WHERE A.TESTNoA = B.TESTNoB で3件のレコードが取得できますよね。 これと同じ結果が欲しいのですが、 検索条件にテーブル型の変数(索引付表?)は使用できるのでしょうか? 変数 TestHen(0) = 11111 TestHen(1) = 33333 TestHen(2) = 55555 こんな感じで設定しておいて、この変数を利用して 一度のSQLで結果を取得したいのです。 できればLIKEを使って検索したいのですが…。 書き方がおかしかったらすみません。 どなたかお知恵をお貸しください。