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需要一点小小的诀窍。因此,请执行以下步骤:

  1. 创build一个重复的表: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. 删除原始表中的所有行: DELETE FROM FUND_ACCOUNT;
  3. 一旦原始表中没有数据,请更改其OFFICE_ID列的数据types: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. 但是,这是棘手的部分。 因为有些行包含空白的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');