厄介な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が生成された列に到達しないのですか?
私はそれを機能させました、なぜ理解したいのですか!?!
制御ファイルに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を使用しています。
ここでの問題は、データファイルのデータなしで式を使用するだけの場合に、データファイルのフィールドとして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 すべてのオプション
入力ファイルの最後の列には、データが含まれている必要があります(スペースまたは文字であるが、nullではない)。私は、最初のレコードには最後の「」の後にヌルが含まれていると思いますが、TRAILING NULLCOLSオプションを使用してヌルを認識するように特に求められない限り、sqlldrは認識しません。また、TRAILING NULLCOLSを使用したくない場合は、ファイルをsqlldrに渡す前に、これらのNULLを処理する必要があります。お役に立てれば
行番号4と同様に、すべての行に5個の「、」を付けてみてください。
空の値を持つcsvファイルに余分なレコードがたくさんあると、同様の問題が発生しました。メモ帳でcsvファイルを開くと、空の行は次のようになります:、、、、、、、、、、、、、、、、、、、、
Excelで開いている場合は表示できません。メモ帳で確認し、それらのレコードを削除してください