带有Oracle Sqlldr的头痛加载时间戳

时间:2014-09-23 07:49:55

标签: sql oracle timestamp sql-loader timestamp-with-timezone

大家好我在使用sqlldr加载带有时间戳值的文件时遇到问题,任何人都可以请一个想法帮助吗? 这是我的文件加载时间戳的行如下所示: ..... 2014-09-02-00.00.00

我的ctrl文件: ... ... Field POSITION(1085)TIMESTAMP)

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

1 个答案:

答案 0 :(得分:2)

SQL * Loader将尝试使用您的默认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,如果这是记录中的最后一个字段,则会起作用。