ORA-26041:DATETIME / INTERVAL数据类型转换错误

时间:2013-10-11 10:03:22

标签: sql oracle timestamp sql-loader

我正在尝试使用SQL-Loader将数据加载到数据库中,但我(和许多其他人一样)对我的时间格式有问题。由于我使用SQL-Loader的技能有限,我找不到以前会帮助我的帖子。所以这里。

我要插入的数据是:

"some text"|"some text"|"some text"|"23-APR-12 12.00.00.000000000 AM"|"some text"|"some text."|"TEXT"|"23-APR-12 12.00.00.000000000 AM"|"some text"|"some text"|"some text"|"some text"|0|

CTL文件如下所示:

OPTIONS (ERRORS=1586)
LOAD DATA 
INFILE 'SOURCE.ldr' "str '{EOL}'"
APPEND
CONTINUEIF NEXT(1:1) = '#'
INTO TABLE "DATABASE_NAME"."TABLE"
FIELDS TERMINATED BY'|'
OPTIONALLY ENCLOSED BY '"' AND '"'
TRAILING NULLCOLS ( 
"DOMAIN" ,
"CONTEXT" ,
"KEY" ,
"CREATED" TIMESTAMP "DD-MON-RR HH.MI.SSXFF AM" ,
"DESCRIPTION" ,
"VALUE" ,
"TYPE" ,
"CHANGED" TIMESTAMP "DD-MON-RR HH.MI.SSXFF AM" ,
"CORPORATEENGLISHVALUE" ,
"CORPORATEVALUE" ,
"ENGLISHVALUE" ,
"OLDDBKEY" ,
"FAVOURITE" )

表:

DOMAIN                  VARCHAR2(255 BYTE)
CONTEXT                 VARCHAR2(255 BYTE)
KEY                     VARCHAR2(255 BYTE)
CREATED                 TIMESTAMP(6)
DESCRIPTION             VARCHAR2(255 BYTE)
VALUE                   VARCHAR2(4000 BYTE)
TYPE                    VARCHAR2(255 BYTE)
CHANGED                 TIMESTAMP(6)
CORPORATEENGLISHVALUE   VARCHAR2(4000 CHAR)
CORPORATEVALUE          VARCHAR2(4000 CHAR)
ENGLISHVALUE            VARCHAR2(4000 CHAR)
OLDDBKEY                VARCHAR2(35 BYTE)
FAVOURITE               NUMBER(1,0)

Oracle数据库有这些NLS:

Date Format:         RRRR-MM-DD
Timestamp Format:    RRRR-MM-DD HH24:MI:SSXFF
Timestamp TZ Format: RRRR-MM-DD HH24:MI:SSXFF TZR

我得到的错误是:

Record 1: Rejected - Error on table "DATABASE_NAME"."TABLE", column "CREATED".
ORA-26041: DATETIME/INTERVAL datatype conversion error

如果我手动将时间戳从23-APR-12 12.00.00.000000000 AM修改为23-APR-12 12.00.00 AM,则可以正常工作。所以我的猜测是"CREATED" TIMESTAMP "DD-MON-RR HH.MI.SSXFF AM"出了问题。 我注意到,当月份显示不同时,相同的ORA-26041会出现错误。在英语中,10月显示为OCT,瑞典语显示为OKT。如果我手动更改数据文件中月份的所有英文版本,则脚本可以正常工作。

1 个答案:

答案 0 :(得分:1)

首先,我将给予@AlexPoole信誉。他以正确的方式指出了我。

我坐在Windows计算机上,示例来自Linux。正确的输入是:

set NLS_DATE_LANGUAGE=AMERICAN

请注意NLS_DATE_LANGUAGE=AMERICAN中不能有空格。我从目标数据库进行了设置导出,以查看它使用的NLS设置,以便我可以复制它。我做了一个简单的复制和粘贴错误。 打印输出如下:NLS_DATE_LANGUAGE = "AMERICAN"应该是NLS_DATE_LANGUAGE=AMERICAN。 这解决了英语日期转换为瑞典语日期的问题。我想它应该适用于任何具有不同月份拼写的人。

第二,要让数据库接受时间23-APR-12 12.00.00.000000000 AM而不产生错误,就这样解决了:

From: "CREATED" TIMESTAMP "DD-MON-RR HH.MI.SSXFF AM"
To:   "CREATED" TIMESTAMP "DD-MON-RR HH.MI.SS.FF AM"

所以要把它包起来。

要在Windows环境中将英语月份(OCT,MAY等)输入非英语数据库,请使用:set NLS_DATE_LANGUAGE=AMERICAN23-APR-12 12.00.00.000000000 AM的正确时间格式为"DD-MON-RR HH.MI.SS.FF AM"

希望这有助于其他任何人。