大家好,我在使用 sqlldr 加载带有时间戳值的文件时遇到问题,有人可以帮忙吗?这是我的文件中要加载时间戳的一行:..... 2014-09-02-00.00.00。
还有我的 ctrl 文件: ... ...字段 POSITION(1085) TIMESTAMP )
每条记录都被拒绝并出现错误:ORA-26041: DATETIME/INTERVAL 数据类型转换错误
大家好,我在使用 sqlldr 加载带有时间戳值的文件时遇到问题,有人可以帮忙吗?这是我的文件中要加载时间戳的一行:..... 2014-09-02-00.00.00。
还有我的 ctrl 文件: ... ...字段 POSITION(1085) TIMESTAMP )
每条记录都被拒绝并出现错误:ORA-26041: DATETIME/INTERVAL 数据类型转换错误
SQL*Loader 将尝试使用您的默认 NLS 会话参数将字符串解释为时间戳,默认情况下将类似于:
select value from nls_session_parameters where parameter = 'NLS_TIMESTAMP_FORMAT';
VALUE
--------------------------------------------------------------------------------
DD-MON-RR HH24.MI.SSXFF
...虽然你的似乎是别的东西,因为该设置给出了 ORA-01843: not a valid month' 与示例字符串。加载的日志文件还将显示它尝试应用的格式:
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 即可。