- PR -

Oracle8i SQL LOADERでのCSV取り込みについて教えて下さい

1
投稿者投稿内容
S_Tatsu
ベテラン
会議室デビュー日: 2005/05/13
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 2005-09-27 17:39
いつもお世話になっております。
この度、SQL LOADERを使用してAccessから出力したCSVファイルをOracleのテーブルに
取り込もうとしていたのですが、うまくいかないことがあり質問させていただきました。
データの中のあるフィールドに改行コードが含まれているのですが、そのフィールドを
ロードしようとすると区切りがおかしくなってしまうようでエラーの方に出力されてし
まいます。
データを"で囲んでみたりしたのですが結果は変わりませんでした。
コントロールのファイルには以下のように記述しております。
LOAD DATA
INFILE *
REPLACE
INTO TABLE TEST_TBL
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
FILD_A DECIMAL EXTERNAL,
FILD_B DECIMAL EXTERNAL,
FILD_C CHAR,
FILD_D CHAR,
FILD_E CHAR,
FILD_F "TO_DATE(:FFF ,'YYYY/MM/DD HH24:MI:SS')"
)

テーブルの構成は以下のようになっております。

名前 NULL? 型
----------------------------------
FILD_A NOT NULL NUMBER(6)
FILD_B NOT NULL NUMBER(5)
FILD_C VARCHAR2(10)
FILD_D VARCHAR2(64)
FILD_E VARCHAR2(4000)
FILD_F DATE

データの中に改行コードが入っていた場合も正しくロードできる方法はありますでしょうか?
またFILD_Eのデータで文字数が250文字程度でも
データ・ファイルのフィールドが最大長を超えています。
といったエラーになってしまいます。
SQL Loaderは今回初めてで初心者で申し訳ございません。
どなたかご教授お願い致します。
いーた
大ベテラン
会議室デビュー日: 2004/07/12
投稿数: 154
お住まい・勤務地: 東京
投稿日時: 2005-09-27 22:57
未検証ですが、制御ファイルに「CONTINUEIF LAST != """"」を追加してみて下さい。
※データを項目毎にダブルコーテーション(")で括っている事が前提です。
これで、ダブルコーテーションが出てくるまでを継続行として扱います。
但し、データ中にダブルコーテーションがある場合はNGです。
S_Tatsu
ベテラン
会議室デビュー日: 2005/05/13
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 2005-09-28 10:27
いーた様
ご返答ありがとうございます。
CONTINUEIF LASTというオプションは知らなかったです。
データを調べてみたところ「"」を使用している項目がありましたので、どうしようかと
考えた結果、Access側でCSVを作成する前に改行コードを別の文字へ置き換えておく
という更新クエリをかけることにしてみました。
データ内に「,」を使っている項目がありそこでも区切りがおかしくなっていましたので
「、」に置き換えました。
今回は他の方法を知らなかったため置き換えを行ったのですが可変長で区切りに使われて
いる文字がデータ内で使われる場合は一般的にはどのように回避されるのでしょうか?

「データ・ファイルのフィールドが最大長を超えています。 」というエラーは
FILD_E CHAR,

FILD_E CHAR(4000),
とすることででなくなりました。
いーた
大ベテラン
会議室デビュー日: 2004/07/12
投稿数: 154
お住まい・勤務地: 東京
投稿日時: 2005-09-28 13:42
引用:

今回は他の方法を知らなかったため置き換えを行ったのですが可変長で区切りに使われて
いる文字がデータ内で使われる場合は一般的にはどのように回避されるのでしょうか?


CSVファイルであればデータを項目毎にダブルコーテーションで括って、
コード:
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'


で上手くいったと思います。

後はSQL*Loaderを使用しない方法でしょうか。
MS-ACCESSであれば直接Oracleに接続して「INSERT INTO 〜 SELECT 〜」で登録してしまっても良いと思います。

引用:

「データ・ファイルのフィールドが最大長を超えています。 」というエラーは
FILD_E CHAR,

FILD_E CHAR(4000),
とすることででなくなりました。


こちらについては回答してませんでしたね、すいません。
SQL*Loaderでは255byteを超過する場合は制御ファイルにサイズを指定する必要がある為です。
1

スキルアップ/キャリアアップ(JOB@IT)