【问题标题】:SQL error "ORA-01722: invalid number"SQL 错误“ORA-01722:无效号码”
【发布时间】:2012-09-14 23:14:16
【问题描述】:

对某人来说很容易, 下面的插页给了我

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

【问题讨论】:

  • 那么...CUSTOMER 的表定义是什么?您只提供了所需信息的一半。
  • 电话号码是唯一可以合理地定义为数字的东西,您的数据不表示为数字(空格不是数字)。所以:检查您的表定义并与您的输入语句进行比较。
  • 为什么人们会否决这个问题。对于刚接触数据库的人来说,这是一个奇怪的错误。我可以看到用引号括起来的值如何使它看起来像一个字符串。这仅取决于数据库的设置。它可能都是字符串或数字,仅取决于字段。可能是创建数据库的时候出错了。
  • "早在 12 岁的时候,我从书架上拿出一本书,并回答了一个 Oracle 问题。在 Stack 上,我仍然很熟练,掌握了我保留的知识,但我仍然不知道'没有接受。"
  • 电话号码不应定义为数字,以免丢失前导零。

标签: sql oracle plsql casting type-conversion


【解决方案1】:

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

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

【讨论】:

  • 另请注意,手动填写带有“(null)”的字段会给您该错误。如果默认值为 null 并且您未完成,它将自动完成 (null) 但键入时不一样。
  • 呃,“字符串不能转换成数字”——这不是重点。字符串可以转换为数字。这里的重点是将数字转换为字符串列,但 Oracle 不会自动执行此操作:您必须自己将其设为字符串,在 SQL 表达式中显式标记值,并用 ' ' OR " " 将其包围.
【解决方案2】:

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

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

上面给你一个

ORA-01722: 无效号码

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这样做会删除前导 0。
    • 这转到原始 OP - 如果您想存储像“0419 853 694”这样的值,您的表格列不能是“数字”类型,因为数字不能有前导零。就我而言,但这正是我所需要的,ty gmlacrosse!
    【解决方案4】:

    嗯,也可以:

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

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

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

    【讨论】:

    • 这很好。另一个有毒的命运可能就是这样。您注释掉了 SELECT Fieldlist 中的一个字段,例如 -- t.fieldname。稍后您打算删除该行开始注释,但意外留下了一个注释字符。因此有: - t.fieldname。这发生在我身上,当我处理一个非常大的查询时,我必须在重新组织野兽时评论/取消评论数百个列。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      这是因为:

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

      如中所述:

      要解决此错误:

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

      【讨论】:

        【解决方案7】:

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

        我有这个问题:

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

        那个提出了问题:Error: ORA-01722: invalid number

        我刚刚包围了 "numerical" 值,使它们成为'Strings',只是使它们明确分隔

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

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

        编辑: 事实上:我表中的 col acc_num 定义为 String。虽然不是数字,但报告了invalid number。而字符串数字的显式分隔解决了这个问题。

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

        从 TABLE 中选择 ma​​x(string_column);

        select string_column from TABLE where string_column '2'和'z'之间;

        select string_column from TABLE where string_column > '1';

        select string_column from TABLE where string_column 'b';

        【讨论】:

        • 我遇到了类似的情况。 ora-01722 在 select 语句中触发了无效编号,而不是在 insert 语句中。我检查了表定义,发现列是varchar而不是数字,所以我在数字周围添加了单引号
        【解决方案8】:

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

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

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

        【讨论】:

          【解决方案9】:

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

          假设您有一个名为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;

          【讨论】:

          • 这是一个非常复杂的例子,说明错误可能发生 + 说明如何解决该特定情况,可能根本不适用。
          【解决方案10】:

          ORA-01722 错误非常简单。根据Tom Kyte

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

          但是,问题出在哪里通常一开始并不明显。 This page 帮助我排查、查找和解决我的问题。提示:查找将字符串显式或隐式转换为数字的位置。 (我的代码中有NVL(number_field, 'string')。)

          【讨论】:

            【解决方案11】:

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

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

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

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

            【讨论】:

              【解决方案12】:

              当您遇到无效号码错误时,也可以试试这个

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

              to_char(a.emplid)=b.emplid

              【讨论】:

                【解决方案13】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-02-14
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-08-09
                  • 2021-05-03
                  • 2023-03-15
                  相关资源
                  最近更新 更多