Oracle11g Oracle 11g SQL加载程序,时间格式问题

Oracle11g Oracle 11g SQL加载程序,时间格式问题,oracle11g,sql-loader,time-format,Oracle11g,Sql Loader,Time Format,我正在尝试使用SQL loader加载.csv文件。我在应存储时间列的列上收到此错误消息: column TIME.ORA-01843: not a valid month 在我的.csv文件中,time的格式是HH:MM:SS,但我不明白为什么Oracle不识别它 使用命令从nls_session_参数中选择*我看到默认的时间格式是HH24.MI.SSXFF。我试图更改csv文件中的时间分隔符,但得到了相同的错误结果 我有一个非常简单的控制文件,如下所示 LOAD DATA INFILE C

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

column TIME.ORA-01843: not a valid month
在我的.csv文件中,time的格式是
HH:MM:SS
,但我不明白为什么Oracle不识别它

使用命令
从nls_session_参数中选择*我看到默认的时间格式是
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) 加载数据 填充循环_事故0512.csv 变成了一场意外 以“,”结尾的字段 (ID), 行政长官, 奥斯汀, 奥斯古北行酒店, WGS_LONG, WGS_LAT, 警队, ACC_严重性, NUM_VEI, NUM_CAS, ACC_日期, 每周一天, 时间 地址:, LOC_AUTH_HIGH, FST_路_级, FST_路_号, 道路类型, 限速, JUNCT_详细信息, JUNCT_控制中心, SND_路_级, SND_ROAD_NUM, PED_-HUM, PED_PHY, 轻便的, 其次, 康德河畔公路, 规格, 卡鲁危险, 乌尔布鲁, 警察局局长, LSOA_ACC_LOC, VEI_型) 如果有人能帮我修改控制文件,使时间格式为Oracle所接受,我们将不胜感激。我试图查找其他网络资源,但没有找到任何有帮助的


谢谢

您提到了查询会话NLS参数,但显示的值似乎是
NLS\u TIME\u FORMAT

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

SQL*加载器将使用
NLS\u DATE\u格式
解释
DATE
字段的数据文件值。如果这是
DD/MM/yyyyy
,那么它会自由地将
22:41:17
这样的值解释为17年第41个月的第22天,这就是您的错误

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

TIME DATE 'HH24:MI:SS',
表中的值将具有该时间,即当月的第一天


SQL*Loader文档提供了我从未见过的功能,我在任何地方都找不到对它的任何引用,包括MOS。一点快速的实验都没有帮助。如果我创建控制文件条目:

TIME TIME,

。。。然后,记录被拒绝,因为
ORA-00933:SQL命令未正确结束
。日志文件还将数据类型显示为
DATETIME HH24.MI.SSXFF
,它看起来与
NLS\u TIME\u格式
值相关。我还没找到办法让它接受这一点。如果我将列定义从
DATE
更改为
TIMESTAMP
,则会出现另一个错误,
ORA-00904:“to_TIME”:无效标识符
,这更奇怪。看起来这些数据类型都是在SQL*Loader中定义的,以备将来使用。(建议他们考虑在10g中添加
TIME
作为数据库类型,但显然无法验证这一点。这至少在9i的SQL*Loader参考中)。

您提到了查询会话NLS参数,但显示的值似乎是
NLS\u TIME\u格式

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

SQL*加载器将使用
NLS\u DATE\u格式
解释
DATE
字段的数据文件值。如果这是
DD/MM/yyyyy
,那么它会自由地将
22:41:17
这样的值解释为17年第41个月的第22天,这就是您的错误

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

TIME DATE 'HH24:MI:SS',
表中的值将具有该时间,即当月的第一天


SQL*Loader文档提供了我从未见过的功能,我在任何地方都找不到对它的任何引用,包括MOS。一点快速的实验都没有帮助。如果我创建控制文件条目:

TIME TIME,

。。。然后,记录被拒绝,因为
ORA-00933:SQL命令未正确结束
。日志文件还将数据类型显示为
DATETIME HH24.MI.SSXFF
,它看起来与
NLS\u TIME\u格式
值相关。我还没找到办法让它接受这一点。如果我将列定义从
DATE
更改为
TIMESTAMP
,则会出现另一个错误,
ORA-00904:“to_TIME”:无效标识符
,这更奇怪。看起来这些数据类型都是在SQL*Loader中定义的,以备将来使用。(建议他们考虑在10g中添加
TIME
作为数据库类型,但显然无法验证这一点。这至少在9i的SQL*Loader参考中)。

您的
TIME
列是什么数据类型?Oracle没有仅限时间的类型,因此推测它实际上是
DATE
类型,或者可能是
TIMESTAMP
。无论哪种方式,列都会有日期部分,即使忽略它。因此,如果数据只有您需要转换的时间,那么如何转换取决于数据类型。您的
time
列是什么数据类型?Oracle没有仅限时间的类型,因此推测它实际上是
DATE
类型,或者可能是
TIMESTAMP
。无论哪种方式,列都会有日期部分,即使忽略它。因此,如果数据只有转换所需的时间,那么转换的方式取决于数据类型。非常感谢您的解释,完整而简洁。我做到了,只是在ctl文件中指定了正确的日期格式。非常感谢您完整、简洁的解释。