SQL 错误“ 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');
1147347 次浏览

这是因为:

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

如下所述:

为了解决这个错误:

只有包含数值的数值字段或字符字段 可以在算术运算中使用。请确保所有表达式 对数字进行评估。

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

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

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

假设 tel_number被定义为 NUMBER-那么在这个提供的值中的空格不能被转换成一个数字:

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

上面给你一个

无效号码

这里有一个解决方法。删除非数字字符,然后将其转换为数字。

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

在我的例子中,转换错误出现在 基于函数的索引中,这是我为表创建的。

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

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

您总是可以使用 TO _ NUMBER ()函数来删除此错误。这可以包含为 INSERTINTO 雇员 phone _ number 值(TO _ NUMBER (’0419853694’) ;

如果执行 insert into...select * from...语句,也很容易得到‘ InvalidNumber’错误。

假设您有一个名为 FUND_ACCOUNT的表,它有两列:

AID_YEAR  char(4)
OFFICE_ID char(5)

让我们假设您希望将 OfficICE _ ID 修改为数字形式,但是表中存在现有的行,更糟糕的是,其中一些行具有’(空白)的 OfficICE _ ID 值。在 Oracle 中,如果表中有数据,就不能修改列的数据类型,而且需要一些技巧才能将 a’转换为0。所以这里有一些方法:

  1. 创建一个重复的表: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. 删除原始表中的所有行: DELETE FROM FUND_ACCOUNT;
  3. 一旦原始表中没有数据,就改变它的 OfficICE _ ID 列的数据类型: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. 但接下来就是棘手的部分了。因为有些行包含空白的 OfficICE _ ID 值,所以如果执行简单的 INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2,就会得到“ ORA-01722无效数字”错误。为了将’’(空白) OfficICE _ ID 转换为0,插入语句必须如下所示:

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

ORA-01722错误很简单,根据 Tom Kyte:

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

然而,问题出现的地方通常一开始并不明显。这一页帮助我排除故障,找到并修复我的问题。提示: 查找显式或隐式将字符串转换为数字的位置。(我的代码中有 NVL(number_field, 'string')。)

如果您有一个无效的数字错误,也可以尝试这样做

在这里 A.emplid 是 number,b.emplid 是 varchar2,所以如果要转换其中一个边

到哪里去 _ char (a.emplid) = b.emplid

它也可以是:

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

其中对于 Oracle 中的连接使用操作符 ||而不是 +

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

Oracle 为 字符串列值执行 自动字符串2号码转换!但是,对于 SQL 中的文本比较,输入必须显式地分隔为 String: 相反的转换数字 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';

就这样,它返回了预期的结果。

编辑: 实际上: 我表中的 colacc_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’;

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

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

该文件本身在文本编辑器中看起来不错,但是当我打开 SQL * 加载程序用被拒绝的行生成的 *.bad文件时,我发现每个原始字符之间都有坏字符。然后我想到了编码。

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

我发现 SQL 语句参数的顺序也很重要,它们在代码中被实例化的顺序也很重要,这在我使用“ Oracle Data Provider for。NET,托管驱动程序”。

var sql = "INSERT INTO table (param1, param2) VALUES (:param1, :param2)";
...
cmd.Parameters.Add(new OracleParameter("param2", Convert.ToInt32("100")));
cmd.Parameters.Add(new OracleParameter("param1", "alpha")); // This should be instantiated above param1.

Param1是 alpha,param2是 numeric,因此出现了“ ORA-01722: 无效数字”错误消息。尽管名称清楚地显示了它在实例化中是哪个参数,但顺序很重要。确保按照定义 SQL 的顺序进行实例化。

对我来说,这个错误是一个有点复杂的问题。

我正在将一组数字(type t_numbers is table of number index by pls_integer;)传递给一个存储过程。在存储过程中有一个 bug,该集合中的数字与 varchar列进行了比较

select ... where ... (exists (select null from table (i_coll) ic where ic.column_value = varchar_column))


Oracle 应该看到 ic.column_value是整数,所以不应该直接与 varchar 进行比较,但它没有(或者对转换例程有信任)。

更复杂的是,存储过程有调试输出,但是在执行 sp 之前出现了这个错误(根本没有调试输出)。

此外,集合[ < void > ]和[0]没有给出错误,但是例如[1]出错了。

在我的案例中,这是一个行尾问题,我用 Dos2unix命令修复了它。