我已经使用相同的控制文件将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条款的条件,只改变了它们的顺序,所以我不应该失败所有在任何一种情况下,他们都很强大...我想知道是否有任何对SQLLDR有更好经验的人能够对这种奇怪的行为有所了解吗?
答案 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,
)