SQLLDR拒绝某些记录,同时接受具有相同值的其他记录

时间:2017-08-01 17:02:53

标签: oracle sql-loader

我已经使用相同的控制文件将TSV文件加载到我们的数据库中一段时间​​了,直到最近才出现问题。

控制文件看起来有点像这样(省略了实际的表名和列名):

INTO TABLE "TABLE_NAME" WHEN RECORD_TYPE = 'TYPE'
FIELDS TERMINATED BY X'9'
TRAILING NULLCOLS
    (ID CONSTANT 'FILE_ID',
     FILE_NAME "'FILE_NAME'",
     IMPORT_START "SYSDATE",
     RECORD_TYPE POSITION(1),
     COLUMN_X,
     COLUMN_Y,
     COLUMN_Z,
    )

RECORD_TYPE是记录中的第一个值。即。

TYPE *TAB* COLUMN_X *TAB* COLUMN_Y *TAB* COLUMN_Z

当我尝试加载文件时,它加载没有任何错误,但在加载大部分文件时丢弃特定记录类型的某些,在日志文件中给我以下消息:

  

记录x:丢弃 - 所有WHEN条款都失败。

我倾倒了文件,看不出数据有什么问题。

我尝试更改各个INTO TABLE "TABLE_NAME" WHEN RECORD_TYPE块的顺序,以便失败的块更接近顶部,以便查看它是否会产生影响并且由于某种原因它起作用。

这对我没有任何意义,因为我没有改变任何WHEN条款的条件,只改变了它们的顺序,所以我不应该失败所有

1 个答案:

答案 0 :(得分:0)

多个INTO TABLE子句以非常不直观的方式工作。见this Ask Tom post。我认为正在发生的是第一个INTO TABLE子句成功处理该行,结束于该行的末尾,然后第二个INTO TABLE子句在同一个地方启动 ,找不到任何因为它位于行的末尾,所以它没有WHEN子句。另见this documentation

听起来你需要使用每个INTO TABLE子句中第一列的POSITION(1)参数来告诉它从行的开头开始:

INTO TABLE "TABLE_NAME" WHEN RECORD_TYPE = 'TYPE'
FIELDS TERMINATED BY X'9'
TRAILING NULLCOLS
    (ID POSITION(1) "'FILE_ID'",
     FILE_NAME "'FILE_NAME'",
     IMPORT_START "SYSDATE",
     RECORD_TYPE POSITION(1),
     COLUMN_X,
     COLUMN_Y,
     COLUMN_Z,
    )