web-dev-qa-db-ja.com

Oracle sqlldr TRAILING NULLCOLSが必要ですが、なぜですか?

厄介なsqlldrの問題があります。私の制御ファイルは次のようになります。

load data
infile 'txgen.dat'
into table TRANSACTION_NEW
fields terminated by "," optionally enclosed by '"'
TRAILING NULLCOLS
( A,
  B,
  C,
  D,
  ID "ID_SEQ.NEXTVAL"
)

データは次のようなものです。

a,b,c,
a,b,,d
a,b,,
a,b,c,d

TRAILING NULLCOLSを入れないと、「論理レコードの終わりの前に列が見つかりません」というエラーが表示されます。ただし、一部の列はヌルですが、コンマがすべてあります。そのため、sqlldrが入力ファイルを誤って解釈し、データベースシーケンスからIDを生成する最後に到達しない理由はわかりません。

この構文は以前はヌル列なしで機能していましたが、なぜヌル列があるとsqlldrが生成された列に到達しないのですか?

私はそれを機能させました、なぜ理解したいのですか!?!

18
orbfish

制御ファイルに5つのフィールドを定義しました。フィールドはコンマで終了するため、SQL Stringを介してIDフィールドにシーケンス値をロードしている場合でも、TRAILING NULLCOLSを指定しない限り、5つのフィールドの各レコードに5つのコンマが必要です。

RE:OPによるコメント

それは簡単なテストでの私の経験ではありません。次の制御ファイルを使用します。

load data
infile *
into table T_new
fields terminated by "," optionally enclosed by '"'
( A,
  B,
  C,
  D,
  ID "ID_SEQ.NEXTVAL"
)
BEGINDATA
1,1,,,
2,2,2,,
3,3,3,3,
4,4,4,4,,
,,,,,

次の出力を生成しました。

Table T_NEW, loaded from every logical record.
Insert option in effect for this table: INSERT

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
A                                   FIRST     *   ,  O(") CHARACTER            
B                                    NEXT     *   ,  O(") CHARACTER            
C                                    NEXT     *   ,  O(") CHARACTER            
D                                    NEXT     *   ,  O(") CHARACTER            
ID                                   NEXT     *   ,  O(") CHARACTER            
    SQL string for column : "ID_SEQ.NEXTVAL"

Record 1: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 2: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 3: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 5: Discarded - all columns null.

Table T_NEW:
  1 Row successfully loaded.
  3 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  1 Row not loaded because all fields were null.

正しくロードされた唯一の行には5つのコンマがあったことに注意してください。 IDを除くすべてのデータ値が存在する3行目でも、データはロードされません。私が何かを逃していない限り...

10gR2を使用しています。

15
DCookie

ここでの問題は、データファイルのデータなしで式を使用するだけの場合に、データファイルのフィールドとしてIDを定義したことです。これを修正するには、IDを式(またはこの場合はシーケンス)として定義します。

ID EXPRESSION "ID_SEQ.nextval"

または

ID SEQUENCE(count)

参照: http://docs.Oracle.com/cd/B28359_01/server.111/b28319/ldr_field_list.htm#i1008234 すべてのオプション

4
Chris

入力ファイルの最後の列には、データが含まれている必要があります(スペースまたは文字であるが、nullではない)。私は、最初のレコードには最後の「」の後にヌルが含まれていると思いますが、TRAILING NULLCOLSオプションを使用してヌルを認識するように特に求められない限り、sqlldrは認識しません。また、TRAILING NULLCOLSを使用したくない場合は、ファイルをsqlldrに渡す前に、これらのNULLを処理する必要があります。お役に立てれば

3
juzz4fun

行番号4と同様に、すべての行に5個の「、」を付けてみてください。

0
ram

空の値を持つcsvファイルに余分なレコードがたくさんあると、同様の問題が発生しました。メモ帳でcsvファイルを開くと、空の行は次のようになります:、、、、、、、、、、、、、、、、、、、、

Excelで開いている場合は表示できません。メモ帳で確認し、それらのレコードを削除してください

0
WizzArt