【问题标题】:Oracle sqlldr TRAILING NULLCOLS required, but why?需要 Oracle sqlldr TRAILING NULLCOLS,但为什么呢?
【发布时间】:2010-10-12 17:21:00
【问题描述】:

我有一个深奥的 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 无法到达生成的列?

我已经成功了,我只是想了解为什么!?!

【问题讨论】:

  • 因为拉里这么说,所以这就是原因。这是预期的行为。
  • 它是有意的没关系,我只是想了解它的机制。

标签: oracle sql-loader


【解决方案1】:

您在控制文件中定义了 5 个字段。您的字段以逗号结尾,因此除非指定了 TRAILING NULLCOLS,否则 5 个字段的每条记录都需要 5 个逗号,即使您通过 SQL 字符串加载带有序列值的 ID 字段。

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 之外的所有数据值都存在,数据也不会加载。除非我错过了什么……

我正在使用 10gR2。

【讨论】:

  • 事实并非如此,因为如果数据总是有 4 个字段(但不是 5 个逗号,甚至 4 个),则不需要 TRAILING NULLCOLS。尽管您在那里有所了解,但这几乎是有道理的....
  • 无法验证这一点,但让您的积分等待是不公平的......
【解决方案2】:

这里的问题是,您将 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 了解所有选项

【讨论】:

    【解决方案3】:

    输入文件中的最后一列必须包含一些数据(无论是空格还是字符,但不能为空)。我猜,第一条记录在最后一个 ',' 之后包含空值,除非特别要求使用 TRAILING NULLCOLS 选项识别空值,否则 sqlldr 将无法识别。 或者,如果您不想使用 TRAILING NULLCOLS,则必须在将文件传递给 sqlldr 之前处理这些 NULL。 希望这会有所帮助

    【讨论】:

      【解决方案4】:

      尝试在每一行中输入 5 ',',类似于第 4 行。

      【讨论】:

        【解决方案5】:

        当我在 csv 文件中有大量带有空值的额外记录时,我遇到了类似的问题。如果我在记事本中打开 csv 文件,则空行如下所示: ,,,, ,,,, ,,,, ,,,,

        如果在 Excel 中打开,您将看不到这些。请在记事本中检查并删除这些记录

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-07
          • 2020-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多