Oracle SQL:插入失败 ORA-01722:无效数字,数据是数字而不是字符串,为啥会失败?
Posted
技术标签:
【中文标题】Oracle SQL:插入失败 ORA-01722:无效数字,数据是数字而不是字符串,为啥会失败?【英文标题】:Oracle SQL: Insert failed ORA-01722: invalid number, Data is numeric not string, why'd it fail?Oracle SQL:插入失败 ORA-01722:无效数字,数据是数字而不是字符串,为什么会失败? 【发布时间】:2016-09-30 07:32:06 【问题描述】:我做了一个快速搜索,有人说这个错误是由于尝试加载应该是字符串的数值导致的?我没有字母字符。我稍后会找到所有列的最小/最大/平均值,所以我需要它们是字符串。
错误:
--第 1 到 50 行插入失败 --ORA-01722: 无效号码 1 行 23 列数据(包括 0):
25:33.5 - - - - - - -1.23 6.56 6.93 0 - - - - - 998.26 - - - - - - - 183.2 2.35 - 840 - - - - - - 1.56 -1.56 0 - - 0 - - - - - - - - 0 84.2 - 47.97 - - - - - - - - - - - 0.81 0.48 - - - - - 0 11.37 4.5 -10.05 - - 13.3
对于列:
INSERT INTO CAR_LOGS (DEVICE_TIME, GX, GY, GZ, G_CALIBRATE, BAROMETER, ENGINE_COOL, ENGINE_LOAD, ENGINE_RPM, FUEL_TRIM_BANK1_LONG, FUEL_TRIM_BANK1_SENSOR1, FUEL_TRIM_BANK1_SENSOR2, FUEL_TRIM_BANK1_SHORT, GPS_VS_OBD_SPEED_DIFF, AIR_INTAKE_TEMP, MASS_AIR_FLOW_RATE, O2_VOLTS_BANK1_SENSOR1, O2_VOLTS_BANK1_SENSOR2, SPEED, THROTTLE_POSITION, TIMING_ADVANCE, TURBO_BOOST_VACUUM_GUAGE, VOLTAGE)
VALUES (27-Sep-2016 19:25:33.467,-1.23,6.56,6.93,-0.0,998.26,183.2,2.35,840.0,1.56,-1.56,0.0,0.0,0.0,84.2,47.97,0.81,0.48,0.0,11.37,4.5,-10.05,13.3);
我在这个文件中有 8k 行数据,当然所有这些数据都失败了。我对sql相当陌生。我父亲是数据库专家,我只是在学校/数据库学习编程。使用 Oracle SQL,我尝试将 csv 文件直接导入表并正确选择列。
另外,我有 20 个文件...对于新手如何以同样的方式加载它们有什么建议吗?
我找到了:
LOAD
DATA
cd path
cat file*.csv > all_files.csv
APPEND INTO TABLE TBL_DATA_FILE
EVALUATE CHECK_CONSTRAINTS
REENABLE DISABLED_CONSTRAINTS
EXCEPTIONS EXCEPTION_TABLE
FIELDS TERMINATED BY ","
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
COL0,
COL1,
COL2,
COL3,
COL4
);
我是否将路径替换为
C:\Users\c_thu\Desktop\Database\CarLogsSEPT.2016
还是直接附在路径后面?
我猜有两个问题,但我只想弄清楚这个错误。第二个问题是嗯。
【问题讨论】:
【参考方案1】:此类错误意味着您尝试插入无法转换为数字的数字列值。你能提供表格描述吗?
请务必使用
to_date('27-Sep-2016 19:25:33.467','dd-mon-yyyy hh24:mi:ss')
插入日期而不是仅发布 2016 年 9 月 27 日 19:25:33.467 时。
不应该在 to_date 函数中指定格式的情况下插入日期。您有一个 NLS_DATE_FORMAT 参数,它说明当前会话期间日期的格式。但是这个参数是依赖于会话的,所以如果你不使用 to_date,你的代码就不能在其他客户端上运行。
【讨论】:
请执行: desc CAR_LOGS;并发布结果。【参考方案2】:问题是您在没有single
quotes
的情况下投入时间。试试下面。
INSERT INTO CAR_LOGS (DEVICE_TIME,
GX,
GY,
GZ,
G_CALIBRATE,
BAROMETER,
ENGINE_COOL,
ENGINE_LOAD,
ENGINE_RPM,
FUEL_TRIM_BANK1_LONG,
FUEL_TRIM_BANK1_SENSOR1,
FUEL_TRIM_BANK1_SENSOR2,
FUEL_TRIM_BANK1_SHORT,
GPS_VS_OBD_SPEED_DIFF,
AIR_INTAKE_TEMP,
MASS_AIR_FLOW_RATE,
O2_VOLTS_BANK1_SENSOR1,
O2_VOLTS_BANK1_SENSOR2,
SPEED,
THROTTLE_POSITION,
TIMING_ADVANCE,
TURBO_BOOST_VACUUM_GUAGE,
VOLTAGE)
VALUES (
TO_TIMESTAMP ('27-Sep-2016 19:25:33.467',
'dd-mon-yyyy HH24:MI:SS.FF'),
-1.23,
6.56,
6.93,
-0.0,
998.26,
183.2,
2.35,
840.0,
1.56,
-1.56,
0.0,
0.0,
0.0,
84.2,
47.97,
0.81,
0.48,
0.0,
11.37,
4.5,
-10.05,
13.3);
快速演示:
CREATE TABLE CAR_LOGS
(
DEVICE_TIME TIMESTAMP, --datatype of column has to be timestamp to show milliseconds
GX NUMBER,
GY NUMBER,
GZ NUMBER
);
记录插入;
INSERT INTO CAR_LOGS (DEVICE_TIME,
GX,
GY,
GZ)
VALUES (
TO_TIMESTAMP ('27-Sep-2016 19:25:33.467',
'dd-mon-yyyy HH24:MI:SS.FF'),
-1.23,
6.56,
6.93);
【讨论】:
非常感谢! 我觉得我说得太早了。我没有编写代码,我只是在右键单击表格后单击导入 gui 上的“添加选定列”。我复制并粘贴了错误的打印输出,而不是代码。运行提供的解决方案后,我得到了同样的错误。 检查表列的数据类型。所有列都是 varchar 或 number。如果所有列都是 varchar,则在所有数字周围加上单引号。此外,您的 DEVICE_TIME 列必须是数据类型 date 才能允许此类插入。退房。以上是关于Oracle SQL:插入失败 ORA-01722:无效数字,数据是数字而不是字符串,为啥会失败?的主要内容,如果未能解决你的问题,请参考以下文章
使用python将数据从csv文件插入oracle时出现错误ORA-01722:无效数字
Oracle sql 错误 ora-01722 无效数字 ora-02063 前行来自
oracle SQL Developer 显示数字数据类型为空,而 Length 函数显示 ORA-01722:无效数字