2

(CSVファイルから)データをOracleデータベースにロードするために、SQL*Loaderを使用します。

これらのデータを受け取るテーブルにはvarchar2(500)、と呼ばれる列がありますCOMMENTS。何らかの理由で、CSVファイルからこの情報を無視したいと思います。したがって、私はこの制御ファイルを作成しました。

Options (BindSize=10000000,Readsize=10000000,Rows=5000,Errors=100)
  Load Data
  Infile 'XXX.txt'
  Append into table T_XXX
  Fields Terminated By ';'
  TRAILING NULLCOLS
(
    ...
    COMMENTS FILLER,
    ...
)

COMMENTSデータベースのフィールドは常にに設定されているため、このコードは正しく機能しているようnullです。

ただし、CSVファイルに、対応するCOMMENTSフィールドが500文字の制限を超えるレコードがある場合、SQL*Loaderからエラーが発生します。

Record 2: Rejected - Error on table T_XXX, column COMMENTS.
Field in data file exceeds maximum length

私のフィールドの処理を本当に除外する方法はありますか?COMMENTS

4

2 に答える 2

2

私はあなたの問題を再現することはできません。SQL *Loader10.2.0.1でOracle10.2.0.3.0を使用しています。

これが私のテストケースです:

SQL> CREATE TABLE test_sqlldr (
  2     ID NUMBER,
  3     comments VARCHAR2(20),
  4     id2 NUMBER
  5  );

Table created

制御ファイル:

LOAD DATA
INFILE test.data
INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( id,
  comments filler,
  id2
)

データファイル:

1;aaa;2
3;abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;4
5;bbb;6

コマンドを使用していて、sqlldr userid=xxx/yyy@zzz control=test.ctlエラーなしですべての行を取得しています。

SQL> select * from test_sqlldr;

        ID COMMENTS                    ID2
---------- -------------------- ----------
         1                               2
         3                               4
         5                               6

別のアプローチを試してみてください。次の制御ファイルで同じ望ましい結果が得られます。

LOAD DATA
INFILE test.data
INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( id,
  comments "substr(:comments,1,0)",
  id2
)

Romaintazのコメントに続く更新:私はそれをもう一度調べて、列のサイズが255文字を超えたときにあなたと同じエラーを得ることができました。これは、SQL * Loaderのデフォルトのデータ型がchar(255)であるためです。より多くのデータを含む列がある場合は、長さを指定する必要があります。次の制御ファイルは、300文字の列の問題を解決しました。

LOAD DATA
INFILE test.data
INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( id,
  comments filler char(4000),
  id2
)

お役に立てれば、

-
ヴィンセント

于 2009-06-11T08:00:31.467 に答える
1

ちょっとした改善を提案するために、次のようなことを試してみてください。

LOAD DATA
IN FILE test.data INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'TRAILING NULLCOLS
(
 id,
 comments char(4000) "substr(:comments, 1, 200)", 
 id2)

これで、すべてのコメントの最初の 200 文字 (またはその場所に指定した任意の数字) を取得します。ただし、入力レコードの一部に 4000 文字を超えるコメント フィールドの値が含まれている場合を除きます。前述の「最大長を超えています」というエラー。しかし、それがまれであるか、またはそうでない場合、すべてのレコードは一部のコメントが 200 文字に切り捨てられてロードされます。

超えるchar(4000)と、SQL ローダー エラーが発生します。ビーストを押し込める距離には制限があります。

于 2009-07-29T23:38:12.510 に答える