SQL错误“ ORA-01722:无效的号码”


101

对某人来说非常简单,以下插入内容为我提供了

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

28
那么...表的定义是CUSTOMER什么?您只提供了所需信息的一半。
格雷格·休吉尔

3
电话号码是唯一可以合理定义为数字的数据,而您的数据则不表示为数字(空格不是数字)。因此:检查表定义并与输入语句进行比较。
APC 2012年

10
人们为什么会否决这个问题。对于数据库新手来说,这是一个奇怪的错误。我可以看到如何用引号将值引起来使它看起来像是一个字符串。这仅取决于数据库的设置方式。可能全部是字符串或数字,仅取决于字段。创建数据库时可能是错误。
sisharp 2013年

出现上述情况的示例:将table_1(rollNumber)值('123')插入;其中rollNumber是“数字”类型的列。
Ishani Gupta

3
“回到十二点,我搁置了一本书,并回答了一个Oracle问题。在'Stack上,我仍然很熟练,拥有我所掌握的知识,但是我仍然没有接受。
亚伦

Answers:


121

尝试将字符串转换为数字,并且无法将字符串转换为数字时,会发生ORA-01722错误。

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


2
还要注意,用“(null)”手动填写字段会给您该错误。如果默认值是null并且您没有完成,它将自动以(null)完成,但是键入时会有所不同。
bogdan.rusu

嗯,“字符串不能转换成数字”-这不是重点。字符串可以转换为数字。这里的重点是将数字反向转换为String列,但是Oracle不会自动执行此操作:您必须自己将其设置为String,并在SQL表达式中显式标记该值,并用''OR'“围起来。 。
弗兰塔

25

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

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

以上给你一个

ORA-01722:编号无效


16

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

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

6
这样做会删除开头的0
乔ç

2
这将转到原始OP-如果您想存储“ 0419 853 694”之类的值,则表列的类型不能为“ number”,因为number不能包含前导零。就我而言,这正是我所需要的,ty gmcrosser!
hipokito 2014年

10

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


8

好吧,也可以是:

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

在oracle中连接的地方,操作符||not +

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


1
不错。这可能是另一个有毒的命运。您注释了SELECT字段列表中的一个字段,例如-t.fieldname。以后,您打算删除该行的开始注释,但是一个注释字符被偶然遗漏了。因此有:-t.fieldname。当我处理一个非常大的查询时,这发生在我身上,在重新组织野兽的同时,我不得不评论/取消对数百个列的注释。
olippuner19年


4

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

我有这个查询:

select max(acc_num) from ACCOUNTS where acc_num between 1001000 and 1001999;

那是一个问题: Error: ORA-01722: invalid number

我刚刚将“数字”起来,使它们成为“字符串”,只是使它们显式分隔

select max(acc_num) from ACCOUNTS where acc_num between '1001000' and '1001999';

... andvoilà:它返回预期的结果。

编辑: 确实:acc_num我表中的col 定义为String。尽管不是数值,但invalid number已有报道。而且明确界定的串号的解决了这个问题。

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

从表中选择max(string_column);

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

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

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


我遇到了类似的情况。ora-01722无效编号是在select语句而非插入语句上触发的。我检查了表定义,发现列是varchar而不是数字,因此我在数字周围添加了单引号
Newton fan

2

就我而言,转换错误是在为表创建的基于函数的index中。

插入的数据还可以。我花了一段时间才弄清楚实际错误来自于越野车索引。

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


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 INTO FUND_ACCOUNT (AID_YEAR, OFFICE_ID) SELECT AID_YEAR, decode(OFFICE_ID,' ',0,OFFICE_ID) FROM FUND_ACCOUNT2;


这是一个非常复杂的示例,其中可能发生错误+解释了如何解决该特定情况,这可能根本不适用。
Jan Doggen 2015年

0

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

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

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

我使用Notepad ++打开了原始文件,并将其转换为ANSI,并且所有内容均已正确加载。


-1

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

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

但是,问题通常在一开始并不明显。 此页面帮助我进行故障排除,查找和解决问题。提示:查找将字符串显式或隐式转换为数字的位置。(我NVL(number_field, 'string')在我的代码中。)


-1

当您遇到无效的数字错误时,也请尝试此操作

在此a.emplid是数字而b.emplid是varchar2,因此如果要转换边之一

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


-4

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.