2014-09-23 34 views
0

嗨我所有的问题加载与sqlldr时间戳值的文件,任何人都可以请帮助一个想法? 这是我的文件加载时间戳的一行: ..... 2014-09-02-00.00.00。头痛加载Oracle时间戳Sqlldr

而且我CTRL文件: ... ... 场位置(1085)TIMESTAMP)

的每个记录被拒绝,并错误: ORA-26041:DATETIME /间隔数据类型转换错误

回答

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将起作用。