Oracle 11g SQL加载器,时间格式问题

时间:2014-05-08 18:39:11

标签: oracle11g sql-loader time-format

我正在尝试使用SQL loader加载.csv文件。我在应存储时间列的列上收到此错误消息:

column TIME.ORA-01843: not a valid month

在我的.csv文件中,时间格式为HH:MM:SS,但我无法理解为什么Oracle无法识别它。

使用命令select * from nls_session_parameters;我看到默认时间格式为HH24.MI.SSXFF。我试图更改我的csv文件中的时间分隔符,但我得到了相同的错误结果。

我有一个非常简单的控制文件,如下所示。

LOAD DATA
INFILE Cycling_Accidents0512.csv
INTO TABLE CYCLING_ACCIDENTS
FIELDS TERMINATED BY ','

(ID,
ACC_ID,
OSGB_EASTING,
OSGB_NORTHING,
WGS_LONG,
WGS_LAT,
POLICE_FORCE,
ACC_SEVERITY,
NUM_VEI,
NUM_CAS,
ACC_DATE,
DAY_WEEK,
TIME,
LOC_AUTH_DIS,
LOC_AUTH_HIGH,
FST_ROAD_CLASS,
FST_ROAD_NUMBER,
ROAD_TYPE,
SPEED_LIMIT,
JUNCT_DETAIL,
JUNCT_CONTROL,
SND_ROAD_CLASS,
SND_ROAD_NUM,
PED_HUM,
PED_PHY,
LIGHT_COND,
WEATH_COND,
ROAD_SUR_COND,
SPEC_COND,
CARR_HAZARDS,
URB_RUR,
POLICE_ATT,
LSOA_ACC_LOC,
VEI_TYPE)

如果有人帮我修改控制文件以使Oracle接受时间格式,那将不胜感激。我试图查看其他网络资源,但我找不到任何有用的东西。

谢谢!

1 个答案:

答案 0 :(得分:4)

您提到查询会话NLS参数,但您显示的值似乎是NLS_TIME_FORMATwhich is only used internally

Oracle没有时间类型,因此您的字段可能实际上是DATE类型(或可能是TIMESTAMP)。即使您忽略它,列中的值也会有一个日期部分。

SQL * Loader将使用NLS_DATE_FORMAT来解释DATE字段的数据文件值。如果那是DD/MM/YYYY那么它将在第17个月中将22:41:17的值解释为第41个月的第22天 - 因此是您的错误 - 。

您可以在控制文件中指定日期格式模型:

TIME DATE 'HH24:MI:SS',

表中的值将在当月的第一天具有该时间。


我从未见过的SQL * Loader文档refer to a TIME data type,我无法在任何地方找到任何引用,包括MOS。一点点的实验都没有帮助。如果我输入控制文件:

TIME TIME,

...然后使用ORA-00933: SQL command not properly ended拒绝记录。日志文件还将数据类型显示为DATETIME HH24.MI.SSXFF,它看起来与NLS_TIME_FORMAT值相关。我还没有找到让它接受的方法。如果我将列定义从DATE更改为TIMESTAMP,那么我会得到一个不同的错误ORA-00904: "TO_TIME": invalid identifier,这甚至更奇怪。看起来这些数据类型在SQL * Loader中定义以供将来使用。 (This discussion建议他们考虑在10g中添加TIME作为数据库类型,但显然无法验证。这在SQL * Loader引用中至少回到9i)。< / p>