我正在尝试使用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接受时间格式,那将不胜感激。我试图查看其他网络资源,但我找不到任何有用的东西。
谢谢!
答案 0 :(得分:4)
您提到查询会话NLS参数,但您显示的值似乎是NLS_TIME_FORMAT
,which 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>