我有一个通过sqlloader填充的表。是否可以在ctl文件中使用逻辑,以便它可以满足具有不同字段数的文件? e.g。
表= field1 field2 field3 field4
文件格式1 = field1 field2 field4
文件格式2 =字段1 field2 field3 field4
根据文件名在不同的.ctl文件之间切换是否最简单(例如,将4个字段的名称与3个字段完全不同),或者sqlloader' count'它已经提供的字段数,然后通过case语句逻辑地将它们应用到表中?
还有一点是,文件中的所有记录都符合一种格式或另一种格式,不会因行而异,这有望使这项任务变得更加容易。
答案 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)"
)
因此,您需要在控制文件中定义六个字段:
field1
和field2
)BOUNDFILLER
变量,您希望将其用作表达式的输入(bind1
和bind2
)field3
和field4
)填充。这些不会映射到输入文件中的任何实际列。 trailing nullcols
选项应将bind2
填充为NULL
,即使您的输入文件只有三列。只有在您不希望四列输入文件的最后一列中有任何NULL
值时,此方法才有效。
我还没有对此进行测试,但可能值得一试。