代码之家  ›  专栏  ›  技术社区  ›  orbfish

需要Oracle sqlldr trailing nullcols,但为什么?

  •  16
  • orbfish  · 技术社区  · 14 年前

    我有一个深奥的问题困扰着我。我的控制文件如下所示:

    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
    

    如果我不把后面的空列放进去,我会得到“在逻辑记录结束之前找不到列”错误。但是尽管有些列是空的,但逗号都在那里,所以我看不出sqlldr曲解输入文件的原因,也看不到它从数据库序列生成ID的末尾。

    此语法以前在没有空列的情况下有效-为什么空列会导致sqlldr无法到达生成的列?

    我已经开始工作了,我只是想知道为什么!?!

    5 回复  |  直到 8 年前
        1
  •  14
  •   DCookie    14 年前

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

    回复:运营商评论

    这不是我做简短测试的经验。使用以下控制文件:

    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。

        2
  •  3
  •   juzz4fun    12 年前

    输入文件中的最后一列必须包含一些数据(可以是空格或字符,但不能为空)。我猜,第一条记录在“last”之后包含空值,除非特别要求sqlldr使用尾随的nullcols选项来识别空值,否则它将无法识别。 或者,如果不想使用尾部的nullcols,则必须在将文件传递给sqlldr之前处理这些nulls。 希望这有帮助

        3
  •  3
  •   Chris    9 年前

    这里的问题是,您已经将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
  •  0
  •   ram    12 年前

    尝试在每行中给出5“,”,类似于第4行。

        5
  •  0
  •   WizzArt    8 年前

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

    如果在Excel中打开,则无法看到这些内容。请签入记事本并删除这些记录