Oracle sqlloader case语句可变列数

Oracle sqlloader case语句可变列数,oracle,sql-loader,Oracle,Sql Loader,我有一个通过sqlloader填充的表。是否可以在ctl文件中使用逻辑,以便它能够适应具有不同字段数的文件?e、 g 表=字段1字段2字段3字段4 文件格式1=字段1字段2字段4 文件格式2=字段1字段2字段3字段4 根据文件名在不同的.ctl文件之间切换是否最简单,例如,使包含4个字段的文件名与包含3个字段的文件名明显不同,或者sqlloader是否可以“计算”提供的字段数,然后通过case语句逻辑地将其应用于表 还有一点是,文件中的所有记录都符合一种或另一种格式,它不会因行而异,这将使这项任

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

表=字段1字段2字段3字段4

文件格式1=字段1字段2字段4

文件格式2=字段1字段2字段3字段4

根据文件名在不同的.ctl文件之间切换是否最简单,例如,使包含4个字段的文件名与包含3个字段的文件名明显不同,或者sqlloader是否可以“计算”提供的字段数,然后通过case语句逻辑地将其应用于表


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

您可以通过为文件中的最后两列使用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)"
)
因此,您将在控制文件中定义六个字段:

前两个字段是您总是希望在文件字段1和字段2中看到的普通字段 接下来的两个变量是要用作表达式bind1和bind2输入的本地BOUNDFILLER变量 最后两个as字段将基于表达式field3和field4填充。这些将不会映射到输入文件中的任何实际列。 即使输入文件只有三列,尾随的nullcols选项也应该将bind2填充为NULL。只有在四列输入文件的最后一列中不存在任何空值时,这种方法才会起作用

我还没有测试过这个,但可能值得一试