sql错误“ORA-01722:无效的数字”
一个很容易的人,下面的插入是给我的“ORA-01722:无效的数字”的错误,为什么?
INSERT INTO CUSTOMER VALUES (1,'MALADY','Claire','27 Smith St Caulfield','0419 853 694'); INSERT INTO CUSTOMER VALUES (2,'GIBSON','Jake','27 Smith St Caulfield','0415 713 598'); INSERT INTO CUSTOMER VALUES (3,'LUU','Barry','5 Jones St Malvern','0413 591 341'); INSERT INTO CUSTOMER VALUES (4,'JONES','Michael','7 Smith St Caulfield','0419 853 694'); INSERT INTO CUSTOMER VALUES (5,'MALADY','Betty','27 Smith St Knox','0418 418 347');
当尝试将string转换为数字时,会发生ORA-01722错误,并且该string不能转换为数字。
没有看到你的表定义,它看起来像你试图将值列表的末尾的数字序列转换为数字,并划定它的空格抛出这个错误。 但根据您提供给我们的信息,可能会发生在任何领域(除第一个领域外)。
假设电话号码被定义为NUMBER
那么空格不能被转换成一个数字:
create table telephone_number (tel_number number); insert into telephone_number values ('0419 853 694');
以上给你一个
ORA-01722:无效的号码
这是解决问题的一种方法。 删除非数字字符,然后将其转换为数字。
cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)
由于这个错误是当你试图在数据库中插入一个非数字值到数值列时,你的最后一个字段可能是数字,而你试图把它作为数据库中的一个string发送。 检查你的最后一个值。
那么它也可以是:
SELECT t.col1, t.col2, ('test' + t.col3) as test_col3 FROM table t;
在oracle中使用运算符||
进行连接 不+
。
在这种情况下,你会得到: ORA-01722: invalid number ...
这是因为:
您执行了试图将string转换为数字的SQL语句,但是该语句不成功。
如下所述:
- Oracle / PLSQL:ORA-01722错误。
要解决此错误:
在算术运算中只能使用包含数值的数字字段或字符字段。 确保所有的expression式都计算为数字。
在我的情况下,转换错误是基于function的索引 ,我已经创build了表。
正在插入的数据是OK的。 我花了一段时间才发现实际的错误来自于马车指数。
如果Oracle能在这种情况下给出更精确的错误信息,那将是很好的。
如果你insert into...select * from...
语句,很容易得到'无效数字'错误。
假设你有一个名为FUND_ACCOUNT
的表,它有两列:
AID_YEAR char(4) OFFICE_ID char(5)
假设您想将OFFICE_ID修改为数字,但是表中存在行,更糟糕的是,其中一些行的OFFICE_ID值为''(空白)。 在Oracle中,如果表中有数据,则不能修改列的数据types,而将“”转换为0需要一点小小的诀窍。因此,请执行以下步骤:
- 创build一个重复的表:
CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
- 删除原始表中的所有行:
DELETE FROM FUND_ACCOUNT;
-
一旦原始表中没有数据,请更改其OFFICE_ID列的数据types:
ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);
-
但是,这是棘手的部分。 因为有些行包含空白的OFFICE_ID值,所以如果你做一个简单的
INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2
,你会得到“ORA-01722无效的数字”错误。 为了将'(空白)OFFICE_IDs转换为0,你的插入语句将看起来像这样:
INSERT INTO FUND_ACCOUNT (AID_YEAR, OFFICE_ID) SELECT AID_YEAR, decode(OFFICE_ID,' ',0,OFFICE_ID) FROM FUND_ACCOUNT2;
我有这个查询:
select max(acc_num) from ACCOUNTS where acc_num between 1001000 and 1001999;
那一个提出了一个问题: Error: ORA-01722: invalid number
我刚刚包围了“数字”的价值观,使它们成为'Strings'
,并且明确地划定它们:
select max(acc_num) from ACCOUNTS where acc_num between '1001000' and '1001999';
…和voilà:它返回预期的结果。
编辑:事实上:在我的表中col acc_num
被定义为String
。 虽然不是数字,但报告了invalid number
。 而string数字的明确分隔解决了这个问题。
另一方面,Oracle 可以将string视为数字。 所以数字操作/函数可以应用在string上,这些查询的工作:
从TABLE中selectmax (string_column);
从TABLE中selectstring_column,其中'2'和'z' 之间的string列;
从TABLE中selectstring_column,其中string_column > '1';
从TABLE中selectstring_column string_column <= 'b';
当你有一个无效的数字错误时,也试试这个
在这个a.emplid是数字和b.emplid是一个varchar2所以如果你要转换其中一方
where to_char(a.emplid)= b.emplid
ORA-01722错误是非常简单的。 汤姆·凯特 ( Tom Kyte)说 :
我们试图将一个string明确或隐含地转换成一个数字,这是失败的。
但是,问题的起因往往不明显。 此页面帮助我解决问题,查找和解决问题。 提示:查找显式或隐式地将string转换为数字的地方。 (我的代码中有NVL(number_field, 'string')
。)
您可以随时使用TO_NUMBER()函数来删除此错误。这可以包含在INSERT INTO employees phone_number values(TO_NUMBER('0419 853 694');