对某人来说非常容易, 以下插页给我
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');
答案 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.所以这里是如何执行此操作:
CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
DELETE FROM FUND_ACCOUNT;
原始表格中没有数据后,请更改其OFFICE_ID列的数据类型:ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);
但接下来是棘手的部分。由于某些行包含空白OFFICE_ID值,因此如果执行简单的INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2
,则会出现“ORA-01722无效数字”错误。为了将''(空白)OFFICE_ID转换为0,您的insert语句必须如下所示:
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');