9

SQL ローダー制御ファイルがあります。

LOAD DATA  
INFILE 'test.txt'  
INTO TABLE TEST replace  
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS  
( DOCUMENTID INTEGER(10),  
  CUSTID INTEGER(10),  
  USERID INTEGER(10),  
  FILENAME VARCHAR(255),  
  LABEL VARCHAR(50),  
  DESCRIPTION VARCHAR(2000),  
  POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE="",  
  USERFILENAME VARCHAR(50),  
  STORAGEPATH VARCHAR(255)
)

SQLローダーを実行するとエラーが発生します。
Record 1: Rejected - Error on table TEST, column FILENAME. Variable length field exceeds maximum length.

これがその行です..その列の長さは255をはるかに下回っています..

1|5001572|2|/Storage/Test/5001572/test.pdf|test.pdf||2005-01-13 11:47:49||

そして、これがログファイル内で気付いた奇妙な点です

Column Name | Position | Len | Term | Encl | Datatype
FILENAME | NEXT | 257 | | | VARCHAR

テーブルと制御ファイルの両方で、長さを 255 と定義しています。それでも、ログはそれを 257 として吐き出しますか? 制御ファイルの長さを 253 に減らしてみたので、ログ ファイルでは 255 と表示されますが、同じ問題です。

何か助けはありますか?これは2日間私を悩ませています。

ありがとう。

4

2 に答える 2

16

データ フィールドを VARCHAR2 および INTEGER として定義しないでください。CHAR を使用します。ほとんどの場合、テキスト ファイルからデータをロードするときは、テキスト形式から変換されますが、CHAR またはおそらく DATE を使用します。ほとんどの場合、長さ指定子さえ必要ありません。CHAR フィールドのデフォルトの長さは 255 です。制御ファイルは次のようになります。

LOAD DATA
INFILE "test.txt"
INTO TABLE TEST replace
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS
(
  DOCUMENTID,
  CUSTID,
  USERID ,
  FILENAME,
  LABEL,
  DESCRIPTION CHAR(2000),
  POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE=BLANKS,
  USERFILENAME,
  STORAGEPATH
)
于 2012-04-30T15:25:45.517 に答える
6

DCookie の場合は +1 ですが、それを拡張するには、テーブルで指定されたデータ型と SQL*loader 制御ファイルのデータ型を区別することが重要です。

ドキュメントを参照することから始めます。通常のテキスト ファイルをロードするときは、「ポータブル」データ型を使用する必要があることに注意してください。

Varchar は「非移植性」タイプであり、次のようになります。

...指定された長さの文字列が続くバイナリ長サブフィールドで構成されます

したがって、DCookie が言うように、CHAR が最適であり、INTEGER EXTERNAL は非常に一般的に使用される SQL*Loader データ型であり、おそらく DOCUMENTID などに指定する必要があります。

于 2012-04-30T15:59:01.957 に答える