1

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

column TIME.ORA-01843: not a valid month

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

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

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

加载数据
INFILE Cycling_Accidents0512.csv
INTO TABLE CYCLING_ACCIDENTS
以“,”结尾的字段

(ID,
ACC_ID,
OSGB_EASTING,
OSGB_NORTHING,
WGS_LONG,
WGS_LAT,
警察部队,
ACC_SEVERITY,
NUM_VEI,
NUM_CAS,
ACC_DATE,
DAY_WEEK,
时间,
LOC_AUTH_DIS,
LOC_AUTH_HIGH,
FST_ROAD_CLASS,
FST_ROAD_NUMBER,
ROAD_TYPE,
速度极限,
JUNCT_DETAIL,
JUNCT_CONTROL,
SND_ROAD_CLASS,
SND_ROAD_NUM,
PED_HUM,
PED_PHY,
LIGHT_COND,
天气条件,
ROAD_SUR_COND,
SPEC_COND,
CARR_HAZARDS,
URB_RUR,
警察_ATT,
LSOA_ACC_LOC,
VEI_TYPE)

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

谢谢!

4

1 回答 1

4

您提到查询会话 NLS 参数,但您显示的值似乎是NLS_TIME_FORMAT仅在内部使用

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

SQL*Loader 将用于NLS_DATE_FORMAT解释DATE字段的数据文件值。如果是这样,DD/MM/YYYY那么它将自由地解释一个值,例如22:41:17第 41 个月的第 22 天 - 因此你的错误 - 在第 17 年。

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

TIME DATE 'HH24:MI:SS',

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


SQL*Loader 文档确实引用了一种我从未见过的TIME数据类型,而且我在任何地方都找不到对它的任何引用,包括 MOS。一些快速的实验并没有帮助。如果我输入控制文件:

TIME TIME,

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

于 2014-05-08T22:38:16.047 回答