SQL*LOADER実行時のロードデータチェック

このQ&Aのポイント
  • SQL*Loaderの制御ファイルにどのような記述をすれば、CSVデータが5桁以上の場合にエラーを出力することができるのでしょうか?
  • 現在の制御ファイルでは、CSVデータの先頭の0が取り込まれず、エラーも発生しない状況です。
  • 解決策として、LPAD関数を使用してCSVデータを0埋めする方法があります。
回答を見る
  • ベストアンサー

SQL*LOADER実行時のロードデータチェック

Sql*Loaderを使用してCSVファイルを取り込む際に、取り込むCSVデータが5桁以上の場合はエラーとしたいのですが。 制御ファイルにどのような記述をすればよいかわかりません。どうか、ご教授お願いいたします。 ちなみに 5桁未満の場合は、0埋めを行っております。 具体的には、以下のような結果を出したいのですが。 ○ 1   ⇒ 00001(0埋めして取り込む) ○ 00001 ⇒ 00001(取り込む) ○ 00000 ⇒ 00000(取り込む) × 000001 ⇒ (取り込まない) ------------------------------------------------------------- 現状、以下のソースだと「1234567」のCSVデータをロードすると、 「34567」で取り込まれてしまいます。(エラー発生しない。) 【Sql*Loaderの制御ファイル】 LOAD DATA   (省略) TRUNCATE TRAILING NULLCOLS ( No_colum "LPAD(:No_colum,5,'0')" , No2_colum "LPAD(:No2_colum,5,'0')" ) 【tmp_tableの情報】 カラム:No_colum vchar2(サイズ:5) カラム:No2_colum vchar2(サイズ:5) ------------------------------------------------------------- どうか、ご教授よろしくお願いいたします。

  • Oracle
  • 回答数2
  • ありがとう数0

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

制御ファイルのWHEN句では < というオペレータは使えないようですね。 フィールドリストでCASE式を使ってはどうでしょうか。 No_colum "CASE WHEN LENGTH(:No_colum) < 5 THEN LPAD(:No_colum,5,'0') ELSE :No_colum END" という感じです。 桁数オーバーになるレコードはエラーになるので取込まれないと思います。

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

LOAD DATA INTO TABLE XXX WHEN No_colum < "000000" AND No2_colum < "000000"   (省略) TRUNCATE TRAILING NULLCOLS ( No_colum "LPAD(:No_colum,5,'0')" , No2_colum "LPAD(:No2_colum,5,'0')" ) でどうでしょう。

neetplease
質問者

補足

ご回答ありがとうございます。 上記のSQLを実行した結果、エラーが発生します。 SQL*Loader-350: 行8に構文エラーがあります。 英数字以外の無効な文字列があります WHEN No_colum < "000000" AND No2_colum < "000000"

関連するQ&A

  • sql*loader 数値のロード

    SQL*LOADERにて NUMBER(3,0)のフィールドに、小数点以下を含む数値をもったデータをロードすると 四捨五入か何かされて整数でデータがロードされてしまいます。 テーブル、CTLファイル、csvレコード、登録結果は以下のとおりです。 テーブル: CREATE TABLE tbl1 ( CLM001 NUMBER(3,0) NOT NULL, CLM002 VARCHAR2(30) ) CTLファイル: LOAD DATA INFILE 'tbl1.csv' BADFILE 'tbl1.bad' TRUNCATE INTO TABLE tbl1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS ( CLM001, CLM002 ) csvレコード: 0.9,aaaaa 3.1,bbbbb 登録結果(SQL*LOADER実行結果): 1,aaaaa 3,bbbbb 小数点を含むデータをロード時にエラーとしたいのですが、何かいい方法ありますでしょうか? 環境はSQL*Loader: Release 9.2.0.1.0になります。

  • 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の制御ファイルについて

    改行を含むデータをLoaderで投入したいのですがうまくいく方法を伝授ください。 レコードは以下です。先頭のみ"無し、末尾は","<CRLF> 3カラム目の先頭が半角スペースで、<CRLF>がきてXXXというデータです。 いろいろ試しましたが、どうもうまくいきません。 このデータをエラー無くロードできる方法はないでしょうか? ご教授ください。 ◆CSVレコード 99999","a-1"," <CRLF>Name-A あいうえお","<CRLF> ◆制御ファイルは以下指定 LOAD DATA INFILE XXX.CSV "STR x'0D0A'" APPEND CONTINUEIF LAST != '"' INTO TABLE table_name FIELDS TERMINATED BY '\",\"' TRAILING NULLCOLS ( COL1, COL2, COL3 ) ちなみに3カラム目が<LF>だとうまくいきます。。。

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

    Oracle初心者です。 掲題の通りなのですが、 excelのファイル内に記述されている表の データをSQL*Loaderでロードするには どうすればいいのでしょうか? まずexcelの表をcsvファイルにすればよいと思うのですが、csvファイルへの仕方がわかりません… 初歩的な質問ですが、よろしくお願いします。

  • SQL*Loaderをダイレクトモードで実行

    するにはどうしたらいいのでしょうか? 例えば以下の場合にダイレクトモードでSQL*Loaderするにはどうしたらいいのでしょうか? sqlldr sato/secret control=x.ctl ただし x_table: create table x_table(i number,s varchar(99)); x.ctl: LOAD DATA INFILE 'x.csv' APPEND INTO TABLE x_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( i,s ) x.csv: 1,"it is iti." 2,"it is ni." 3,"it is san."

  • SQL*Loaderで、データを加工してロードしたいです。

    SQL*Loaderを使ってデータをテーブルにロードしたいのですが、その際に、データを加工してロードしたいと考えております。 ◎使用するコントロールファイルのサンプル (項目1)(項目2)(項目3) 12345, abcde, ABCDE ◎使用するコントロールファイルのサンプル Load Data truncate Into Table "Sample" Fields terminated by ',' Optionally enclosed by '"' (  項目1,  項目2,  項目3,  項目4 EXPRESSION ":項目1(の下1桁)|| ' ' || :項目2(の下2桁)|| ' ' || :項目3(の下3桁)" ) まず、項目4には、項目1~3のデータを連結したものをロードしたいと考えております。 その際に、 項目4(6桁)="項目1の下1桁"+"項目2の下2桁"+"項目3の下3桁" となるようにしたいのですが、どのような関数を使ったらよいのでしょうか? また、連結する関数"EXPRESSION"とどのように組み合わせたらよいのか教えていただけないでしょうか? 思い当たる様々なキーワードでググってみたのですが、参考になるページを見つけることができませんでした。 「ヒントやるから自分で調べろ」みたいなお返事でも結構ですので、アドバイスをいただけますようお願い申し上げます。

  • 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でのデータロード

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

  • SQL*LOADER実行時の一時領域について

    いつもお世話になります。m(__)m Oracle 8i パーティション分割した表へSQL*LOADER(ダイレクトパス)を使用しデータをロードした場合での、 インデックス作成時に使用される一時領域について教えて下さい。 (1)パーティションがA、Bとあり共にデータが登録済み (2)AのパーティションのみをTRUNCATE (3)Aに該当するデータのみをSQL*LOADERでロード この場合、SQL*LOADERでインデックスが作成される時に使用される一時領域はAのみでしょうか? それともA+Bの領域が必要となるのでしょうか?