sqlldr case语句变量列数

时间:2015-03-26 14:24:47

标签: oracle sql-loader

我有一个通过sqlloader填充的表。是否可以在ctl文件中使用逻辑,以便它可以满足具有不同字段数的文件? e.g。

表= field1 field2 field3 field4

文件格式1 = field1 field2 field4

文件格式2 =字段1 field2 field3 field4

根据文件名在不同的.ctl文件之间切换是否最简单(例如,将4个字段的名称与3个字段完全不同),或者sqlloader' count'它已经提供的字段数,然后通过case语句逻辑地将它们应用到表中?

还有一点是,文件中的所有记录都符合一种格式或另一种格式,不会因行而异,这有望使这项任务变得更加容易。

1 个答案:

答案 0 :(得分:0)

您可以通过对文件中的最后两列使用BOUNDFILLER字段类型来执行此操作。示例控制文件可能如下所示:

load data characterset WE8ISO8859P15
infile 'mydata.dat'
badfile 'mydata.bad'
discardfile 'mydata.dsc'
append
into table mytable fields terminated by whitespace trailing nullcols
(
  field1,
  field2,
  bind1 BOUNDFILLER,
  bind2 BOUNDFILLER,
  -- if bind2 is present, use value of bind1, else set to null
  field3 "nvl2(:bind2, :bind1, null)",
  -- if bind2 is null, use value of bind1
  field4 "nvl(:bind2, :bind1)"
)

因此,您需要在控制文件中定义六个字段:

  • 前两个"正常"您希望在文件中看到的字段(field1field2
  • 接下来的两个作为本地BOUNDFILLER变量,您希望将其用作表达式的输入(bind1bind2
  • 最后两个作为字段,您将根据表达式(field3field4)填充。这些不会映射到输入文件中的任何实际列。

trailing nullcols选项应将bind2填充为NULL,即使您的输入文件只有三列。只有在您不希望四列输入文件的最后一列中有任何NULL值时,此方法才有效。

我还没有对此进行测试,但可能值得一试。