125

对某人来说非常简单,下面的插页给了我

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

13 回答 13

144

尝试将字符串转换为数字时出现 ORA-01722 错误,但无法将字符串转换为数字。

在没有看到您的表定义的情况下,您似乎正在尝试将值列表末尾的数字序列转换为数字,并且分隔它的空格会引发此错误。但根据您提供给我们的信息,它可能发生在任何领域(除了第一个领域)。

于 2012-09-23T01:32:35.087 回答
29

假设电话号码被定义为NUMBER那么空格不能转换为数字:

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

以上给你一个

ORA-01722: 无效号码

于 2012-09-23T08:37:53.787 回答
20

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

cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)
于 2013-12-27T15:35:57.033 回答
12

那么它也可以是:

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

在 oracle 中的连接使用运算符||not +

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

于 2016-08-08T12:35:39.177 回答
10

As this error comes when you are trying to insert non-numeric value into a numeric column in db it seems that your last field might be numeric and you are trying to send it as a string in database. check your last value.

于 2012-09-23T03:10:35.173 回答
9

这是因为:

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

如中所述:

要解决此错误:

只有数字字段或包含数值的字符字段才能用于算术运算。确保所有表达式都计算为数字。

于 2012-09-23T01:31:48.187 回答
8

Oracle为String 列值自动进行 String2number转换!但是,对于 SQL 中的文本比较,输入必须明确地分隔为字符串:相反的转换 number2String 不会自动执行,不在 SQL 查询级别。

我有这个查询:

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

...然后瞧:它返回预期的结果。

编辑: 确实:我表中的 colacc_num定义为String. 虽然不是数字,但invalid number报告了。字符串数字的显式定界解决了这个问题。

另一方面,Oracle可以将字符串视为数字。所以数值运算/函数可以应用于字符串,并且这些查询有效:

从表中选择最大值(string_column);

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

从表中选择 string_column 其中 string_column > '1';

从表中选择 string_column 其中 string_column <= 'b';

于 2017-11-15T12:08:52.927 回答
3

在我的情况下,转换错误出现在我为表创建的基于功能的索引中。

插入的数据没问题。我花了一段时间才弄清楚实际错误来自错误索引。

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

于 2014-09-02T14:28:33.983 回答
2

如果你做一个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 Invalid Number”错误。为了将“”(空白)OFFICE_ID 转换为 0,您的插入语句必须如下所示:

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

于 2015-09-23T22:23:21.923 回答
0

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

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

该文件本身在文本编辑器中看起来不错,但是当我打开*.badSQL*loader 生成的带有被拒绝行的文件时,我看到它在每个原始字符之间都有坏字符。然后我想到了编码。

我用记事本++打开了原始文件并将其转换为ANSI,并且所有内容都正确加载。

于 2020-03-12T14:54:12.230 回答
0

ORA-01722 错误非常简单。根据汤姆凯特的说法:

我们尝试将字符串显式或隐式转换为数字,但都失败了。

然而,问题出在哪里往往一开始并不明显。 此页面帮助我排除故障、查找并解决我的问题。提示:查找将字符串显式或隐式转换为数字的位置。(我NVL(number_field, 'string')的代码中有。)

于 2016-05-11T23:01:17.203 回答
-1

试试这个,当你有一个无效的数字错误

在这个 a.emplid 是数字, b.emplid 是一个 varchar2 所以如果你必须转换其中一个边

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

于 2016-06-08T14:35:05.303 回答
-4

您始终可以使用 TO_NUMBER() 函数来消除此错误。这可以作为 INSERT INTO 员工电话号码值包含在内(TO_NUMBER('0419 853 694');

于 2014-10-11T06:08:05.663 回答