SQL错误“ORA-01722:无效的数字”

时间:2012-09-23 01:24:16

标签: sql oracle plsql casting type-conversion

对某人来说非常容易, 以下插页给我

  

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');

12 个答案:

答案 0 :(得分:21)

假设电话号码定义为NUMBER,则空格无法转换为数字:

create table telephone_number (tel_number number);
insert into telephone_number values ('0419 853 694');

上面给出了一个

  

ORA-01722:无效号码

答案 1 :(得分:14)

这是解决问题的一种方法。删除非数字字符,然后将其转换为数字。

cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)

答案 2 :(得分:10)

当您尝试将非数字值插入db中的数字列时出现此错误,似乎您的最后一个字段可能是数字,并且您尝试将其作为字符串发送到数据库中。检查你的最后一个价值。

答案 3 :(得分:8)

那么它也可以是:

SELECT t.col1, t.col2, ('test' + t.col3) as test_col3 
FROM table t;

使用oracle中的连接时,运算符||不是+

在这种情况下,您会得到:ORA-01722: invalid number ...

答案 4 :(得分:7)

这是因为:

  

您执行了一个尝试将字符串转换为a的SQL语句   数字,但没有成功。

如下所述:

解决此错误:

  

仅包含数字值的数字字段或字符字段   可用于算术运算。确保所有表达式   评估数字。

答案 5 :(得分:2)

在我的情况下,转换错误位于基于功能的索引,这是我为表创建的。

正在插入的数据正常。我花了一段时间才弄清楚实际的错误是来自错误指数。

如果Oracle在这种情况下可以提供更准确的错误消息,那就太好了。

答案 6 :(得分:2)

我有这个问题:

  

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';

...和il:它会返回预期的结果。

修改 确实:我表中的col acc_num被定义为String。虽然没有数字,但报告了invalid number。而字符串数字的显式分隔解决了这个问题。

另一方面,Oracle 可以将字符串视为数字。因此,数值运算/函数可以应用于字符串,这些查询可以工作:

  

从TABLE中选择 max (string_column);

     

从TABLE中选择string_column,其中string_column 介于'2'和'z'之间;

     

从TABLE中选择string_column,其中string_column > '1';

     

从TABLE中选择string_column,其中string_column < = 'b';

答案 7 :(得分:1)

如果您执行insert into...select * from...语句,也很容易收到“无效号码”错误。

假设您有一个名为FUND_ACCOUNT的表,其中包含两列:

AID_YEAR  char(4)
OFFICE_ID char(5)

让我们说你想要将OFFICE_ID修改为数字,但表中有现有的行,更糟糕的是,其中一些行的OFFICE_ID值为''(空白)。在Oracle中,如果表中包含数据,则无法修改列的数据类型,并且需要一些技巧将''转换为0.所以这里是如何执行此操作:

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

  4. 但接下来是棘手的部分。由于某些行包含空白OFFICE_ID值,因此如果执行简单的INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2,则会出现“ORA-01722无效数字”错误。为了将''(空白)OFFICE_ID转换为0,您的insert语句必须如下所示:

  5. INSERT INTO FUND_ACCOUNT (AID_YEAR, OFFICE_ID) SELECT AID_YEAR, decode(OFFICE_ID,' ',0,OFFICE_ID) FROM FUND_ACCOUNT2;

答案 8 :(得分:0)

这也发生在我身上,但问题实际上有所不同:文件编码

文件正确,但是文件编码错误。它是由SQL Server的导出实用程序生成的,我将其另存为Unicode。

文件本身在文本编辑器中看起来不错,但是当我打开SQL * loader用拒绝的行生成的*.bad文件时,我发现每个原始字符之间都有错误字符。然后我会讲一下编码。

我用Notepad ++打开了原始文件,并将其转换为ANSI,并且一切都正确加载。

答案 9 :(得分:-1)

ORA-01722错误非常简单。根据{{​​3}}:

  

我们试图明确或暗示将字符串转换为数字而且失败了。

然而,问题所在的地方一开始往往不明显。 Tom Kyte帮助我解决了问题,找到并解决了我的问题。提示:查找显式或隐式将字符串转换为数字的位置。 (我的代码中有NVL(number_field, 'string')。)

答案 10 :(得分:-1)

如果您的号码错误无效

,请尝试此操作

在此 a.emplid是数字,b.emplid是varchar2,所以如果你要转换其中一个

其中to_char(a.emplid)= b.emplid

答案 11 :(得分:-4)

您可以随时使用TO_NUMBER()函数来删除此错误。这可以作为INSERT INTO员工的phone_number值包含在内(TO_NUMBER(' 0419 853 694');