Oracle11g Oracle 11g SQL加载程序,时间格式问题
我正在尝试使用SQL loader加载.csv文件。我在应存储时间列的列上收到此错误消息: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
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文件中指定了正确的日期格式。非常感谢您完整、简洁的解释。