• ベストアンサー

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"とどのように組み合わせたらよいのか教えていただけないでしょうか? 思い当たる様々なキーワードでググってみたのですが、参考になるページを見つけることができませんでした。 「ヒントやるから自分で調べろ」みたいなお返事でも結構ですので、アドバイスをいただけますようお願い申し上げます。

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

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

  • ベストアンサー
  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.3

#1です。すいません、訂正です。 項目4 EXPRESSION "SUBSTR(:項目1,-1,1)|| ' ' || SUBSTR(:項目2,-1,2)|| ' ' || SUBSTR(:項目3,-1,3)"

rhymester
質問者

お礼

やっぱりそうだったんですね^^ ご回答いただいた次の日に試してみたら、うまくいかなかったので、訂正していただいたように入力したら正しくロードできました。 わざわざ教えていただいてありがとうございますm(_ _)m

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

答えはもう書かれているようですが、sqlldrのドキュメントが見つからなかったということでしたんで、OTNのリンクつけておきます。

参考URL:
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19211-01/ldr_field_list.html
rhymester
質問者

お礼

参考URLを教えていただきましてありがとうございます^^ 問題になってた部分以外も、ぜひ参考にさせていただきます♪

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.1

SUBSTRで。 項目4 EXPRESSION "SUBSTR(:項目1,-1,1)|| ' ' || (:項目2,-1,2)|| ' ' || (:項目3,-1,3)" この場合は半角英数なのでSUBSTRBが適切かな。

rhymester
質問者

お礼

ご回答いただきましてありがとうございます!! 明日さっそく試してみようと思います。

関連するQ&A

  • SQL*LOADER 最終列のLENが1

    お世話になります。 前提として 次のようなctlファイルがあります。 OPTIONS(ROWS=500,BINDSIZE=700000) LOAD DATA INFILE '/home/oracle/TEST/00_BIN/YOSAN.csv' TRUNCATE INTO TABLE MT_YOSAN ( 日付 TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"', 店舗コード TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"', 予算 TERMINATED BY ',' NULLIF 昨年実績=BLANKS, 昨年実績 NULLIF 昨年実績=BLANKS ) ロード対象のCSVですが、次のようなROWデータになります。 "2011/02/22","01010",30000,25000 テーブル仕様は次のようになっています。 日付      VARCHAR2(20) NOT NULL 店舗コード  VARCHAR2(20) NOT NULL 予算      NUMBER(10) 昨年実績   NUMBER(10) これを実行した際に昨年実績のカラムに25000の先頭の2しかロードされません。 ログファイルを開くと他のLenは*に対して最後の昨年実績列は1が設定されていました。 この事象の原因と対処法がわかる方がいればご教示いただきたく存じます。 よろしくお願いいたします。 またsqlldr実行時は引数controlとlogのみ指定しています。

  • 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を用いて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にて 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ローダーCSV取込で、囲み文字がデータ中に入っている場合について

    SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について お世話になります。 SQLローダーでCSV取込を行っています。 設定は下記のようになっており、区切り文字はコンマ  囲み文字はダブルコーテーションを指定しています。 LOAD DATA TRUNCATE CONTINUEIF LAST != '"' INTO TABLE WORKTABLE FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( data1 char, data2 char, data3 char ) このように取り込んだところ、下記のような行でエラーが発生しました。 「"data1","data2",""文字列,文字列""」 どうやら元々ダブルコーテーションで囲まれていたデータが CSV出力時にもう1度囲まれた状態のようです。 エラー内容 「TERMINATEDとENCLOSEDフィールドに続く終了記号がありません。」 原因はダブルコートであることはわかっています。 色々試したのですが、うまくいきません。 このデータをうまく取り込む方法はあるのでしょうか よろしくお願いいたします。

  • 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) ------------------------------------------------------------- どうか、ご教授よろしくお願いいたします。

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

  • MySQLのLOAD DATAに関して

    MySQLのLOAD DATAで、固定長行フォーマットのファイルのロードを行っています。 その際、以下のような現象の原因がわからず困っています。 データをロードするテーブル、ロードファイル、実行コマンドは以下になります。 -------------------- テーブル -------------------- フィールド1 char(2) フィールド2 char(2) -------------------- ロードファイル(テキストファイル) -------------------- 1020 3040 -------------------- 実行コマンド -------------------- LOAD DATA INFILE 'ロードファイル' INTO TABLE テーブル FIELDS TERMINATED BY '' ENCLOSED BY '' LINES TERMINATED BY '\r\n'; 結果は以下のように、フィールド2にはデータが登録されていません。 ------------- フィールド1  | フィールド2 ------------- 10      |  30      |  望んでいる結果は以下のような結果です。 ------------- フィールド1 | フィールド2 ------------- 10     |20  30     |40  いろいろ試してみたのですが、 どうもchar(2)の場合は2バイトの倍の4バイト、 char(4)バイトの場合は倍の8バイトというふうにデータが区切られるため、 フィールド1のデータを取得する際に4バイト取得してしまっており、 フィールド2の分のデータが取得できません。 どこに不備があるのかわからないのですが、 何か原因の検討がつく方がいたら、ご回答よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLローダーで複数のCSVファイルのデータを一つのテーブルにInsertしたい

    お世話になります、 以下のようにデータをSQLLDRでインサートしようと思っているのですが、複数のCSVファイルのデータを一つのテーブルにInsertしたい場合にどのようにすればいいか教えてください。 --バッチファイル sqlldr userid=fmwuser/fmwuser@fmw001 control=ctl/AUTHORITY.CTL log=section1.log data=csv/AUTHORITY.csv --CTLファイル LOAD DATA TRUNCATE INTO TABLE AUTHORITY FIELDS TERMINATED BY ',' ( AUTHORITYCODE ,AUTHORITYNAME,EXECUTIVE) CTLファイルでTRUNCATEを付けるとテーブルを初期化してからインサートするからむりですよね... TRUNCATEをはずすと、データが入っているテーブルに対してSQLLDRは使用できないと怒られるし... CSVファイルを一つにまとめるしかないのでしょうか?