0

我正在尝试为 SQL*Loader 脚本创建一个控制文件。我有一个定义为 NOT NULL 的日期列。如果来自文件的传入值为空白,我需要设置脚本以使用当前日期。我尝试了几种方法-下面的一些示例-但是在运行 sql loader 时我一直遇到错误,但是如果我确实从 dual 中进行选择,则该格式有效

我需要如何在 SQLLoader 中进行设置?

  PROGRAM_CHANGE_TS     POSITION(37:47) DATE "decode(length(trim(:PROGRAM_CHANGE_TS)), 11, to_date(:PROGRAM_CHANGE_TS,'yymmddHH24:MI'),to_date(sysdate,'yymmddHH24:MI'))",
  PROGRAM_CHANGE_TS     POSITION(37:47) DATE "NVL(Decode(:PROGRAM_CHANGE_TS,'00/00/0000',TO_DATE('01/01/2010','dd/mm/yyyy'),TO_DATE(:PROGRAM_CHANGE_TS,'dd/mm/yyyy')),TO_DATE('01/01/2010','dd/mm/yyyy'))",

oracle 解码示例 ORA-00907:缺少右括号

select decode(length(trim(:PROGRAM_CHANGE_TS)), 11, to_date(:PROGRAM_CHANGE_TS,'yymmddHH24:MI'),to_date(sysdate,'yymmddHH24:MI')) from dual

或者

select NVL(Decode(:PROGRAM_CHANGE_TS,'00/00/0000',TO_DATE('01/01/2010','dd/mm/yyyy'),TO_DATE(:PROGRAM_CHANGE_TS,'dd/mm/yyyy')),TO_DATE('01/01/2010','dd/mm/yyyy')) from dual

作品

我需要进行哪些更改才能从 sql 加载程序控制文件中使用它?

4

2 回答 2

0

to_date在 ctl 文件中使用,因此请删除显式DATE说明符。

此外,您不需要使用 usedecodelengthnvl以及trim要走的路。

最后,sysdate已经是一个日期,因此您不需要将其显式转换为带有to_date.

以下应该有效(未经测试):

PROGRAM_CHANGE_TS POSITION(37:47) "nvl(to_date(trim(:PROGRAM_CHANGE_TS),'yymmddHH24:MI'),sysdate)",
于 2015-01-08T06:28:21.193 回答
0

如果来自文件的传入值为空白,我需要设置脚本以使用当前日期。

如果您获得NULL日期列的值,则只需使用NVL函数来加载SYSDATE

PROGRAM_CHANGE_TS POSITION(37:47) DATE "NVL(:PROGRAM_CHANGE_TS, SYSDATE)"

不要混淆BLANKNULL00/00/0000既不空白也不为空。如果你得到00/00/0000的价值,那么使用DECODE.

PROGRAM_CHANGE_TS POSITION(37:47) DATE "DECODE(:PROGRAM_CHANGE_TS, '00/00/0000', SYSDATE, :PROGRAM_CHANGE_TS)"

于 2015-01-08T06:28:48.100 回答