1

我正在尝试使用 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 AM23-APR-12 12.00.00 AM它可以正常工作。所以我的猜测是"CREATED" TIMESTAMP "DD-MON-RR HH.MI.SSXFF AM". 我还注意到,当月份显示不同时,相同的 ORA-26041 会出现错误。在英语中,October 是 show as OCT,在瑞典语中是它的OKT. 如果我手动更改数据文件中月份的所有英文版本,脚本就可以工作。

4

1 回答 1

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"

所以总结一下。

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

希望这对其他人有帮助。

于 2013-10-15T07:49:06.383 回答