SQL*加载器-如果传入值为空,则使用sysdate

SQL*加载器-如果传入值为空,则使用sysdate,date,oracle11g,sql-loader,non-nullable,Date,Oracle11g,Sql Loader,Non Nullable,我正在尝试为SQL*加载程序脚本创建一个控制文件。我有一个日期列定义为NOTNULL。如果文件中的输入值为空,我需要将脚本设置为使用当前日期。我尝试了几种方法——下面是一些示例——但在运行sql loader时,我不断遇到下面的错误,但如果我从dual中进行选择,则该格式可以工作 我需要如何在SQLLoader中设置它 PROGRAM_CHANGE_TS POSITION(37:47) DATE "decode(length(trim(:PROGRAM_CHANGE_TS)), 11

我正在尝试为SQL*加载程序脚本创建一个控制文件。我有一个日期列定义为NOTNULL。如果文件中的输入值为空,我需要将脚本设置为使用当前日期。我尝试了几种方法——下面是一些示例——但在运行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

工作


要从sql加载器控制文件中使用它,我需要做哪些更改?

您正在ctl文件中使用
to_date
,因此请删除显式
日期
说明符

此外,您不需要使用
decode
length
nvl
以及
trim
是一种方法

最后,
sysdate
已经是一个日期,因此您不需要使用
to\u date
将其明确转换为日期

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

如果文件中的输入值为空,我需要将脚本设置为使用当前日期

如果日期列的值为
NULL
,则只需使用
NVL
函数即可加载
SYSDATE

程序更改位置(37:47)日期“NVL(:程序更改,系统日期)”

不要混淆
空白
<代码>00/00/0000既不为空也不为空。如果将
00/00/0000
作为值,则使用
DECODE


程序更改位置(37:47)日期“解码(:程序更改,'00/00/0000',系统日期,:程序更改)”

谢谢。我使用了NVL部件,现在它在获取ORA-00907错误方面更进一步。这一错误现已消除。当传入数据为空格-
列程序\u CHANGE\TS.ORA-01858时,我仍然收到以下错误:在预期为数字的位置找到了非数字字符
。我如何解决该部分?还有一个问题-非空白数据有两位数的年份,因此它被全部插入为20YY,我如何更改它,使高于70的数据转换为19YY?使用
RR
格式,而不是
YY
<代码>从dual@adbdkb中选择日期('01/01/72','dd/mm/rr'),您确定
NVL
抛出
ORA-00907
?包装:修剪中的程序更改():“NVL(修剪(:程序更改),系统日期)”。这样NVL应该看到NULL而不是空格。对不起,错误地在上面添加了注释。我测试了这个NVL。谢谢我使用了NVL部件,现在它在获取ORA-00907错误方面更进一步。这一错误现已消除。当传入的数据是空格-列程序_CHANGE_TS.ORA-01858时,我仍然收到以下错误:在预期的数字位置发现了一个非数字字符。我怎样才能解决这个问题?还有一个问题-非空白数据有两位数的年份,因此它被全部插入为20YY,我如何更改它,使高于70的数据转换为19YY?如果您发布
create table
语句
*.ctl
文件和一些样本数据记录,我们可以更好地帮助您。
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
PROGRAM_CHANGE_TS POSITION(37:47) "nvl(to_date(trim(:PROGRAM_CHANGE_TS),'yymmddHH24:MI'),sysdate)",