使用Oracle Sqlldr加载头痛时间戳



大家好,我在用sqlldr加载带有时间戳值的文件时遇到问题,有人能帮忙吗?这就是我的文件中要加载的带有时间戳的一行的样子:……2014-09-02-00.00.00。

和我的ctrl文件:。。。。。。字段位置(1085)时间戳)

每条记录都会被拒绝,并出现以下错误:ORA-26041:DATETIME/INVERVAL数据类型转换错误

SQL*加载器将尝试使用默认的NLS会话参数将字符串解释为时间戳,默认情况下,该参数类似于:

select value from nls_session_parameters where parameter = 'NLS_TIMESTAMP_FORMAT';
VALUE
--------------------------------------------------------------------------------
DD-MON-RR HH24.MI.SSXFF

尽管您的设置似乎是其他内容,因为该设置使用示例字符串给出ORA-01843:不是有效的月份。加载的日志文件还将显示它尝试应用的格式:

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
"<field>"                            1085     *   ,       DATETIME DD-MON-RR HH24.MI.SSXFF

无论您的默认格式是什么,它似乎都与文件中的格式不匹配。您可以更改数据库的格式或使用登录触发器,但如果您有其他期望现有格式的源或输出,则这将没有帮助;而且无论如何都不应该依赖NLS设置,因为它们在另一个环境中可能会有所不同。

您可以提供时间戳格式作为字段定义的一部分:

... Field POSITION(1085) TIMESTAMP "YYYY-MM-DD-HH24.MI.SS")

如果您的列是timestamp with time zone(由标签建议,但不是问题),则它将插入会话的时区。

更常见的是指定位置范围,尽管如果这是记录中的最后一个字段,则仅提供起始位置1085即可。

最新更新