Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL错误“;ORA-01722:无效编号“;_Sql_Oracle_Plsql_Casting_Type Conversion - Fatal编程技术网

SQL错误“;ORA-01722:无效编号“;

SQL错误“;ORA-01722:无效编号“;,sql,oracle,plsql,casting,type-conversion,Sql,Oracle,Plsql,Casting,Type Conversion,对某人来说很容易, 下面的插页为我提供了 ORA-01722:无效号码 为什么? 这是因为: 您执行了一条SQL语句,试图将字符串转换为 号码,但没有成功 如中所述: 要解决此错误,请执行以下操作: 仅限包含数值的数值字段或字符字段 可用于算术运算。确保所有表达式 对数字进行评估 当试图将字符串转换为数字,而该字符串无法转换为数字时,会发生ORA-01722错误 在没有看到表定义的情况下,看起来您正试图将值列表末尾的数字序列转换为数字,而分隔它的空格引发了此错误。但根据您给我们的信息,它可

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

ORA-01722:无效号码

为什么?

这是因为:

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

如中所述:

要解决此错误,请执行以下操作:

仅限包含数值的数值字段或字符字段 可用于算术运算。确保所有表达式 对数字进行评估


当试图将字符串转换为数字,而该字符串无法转换为数字时,会发生ORA-01722错误


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

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

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

create table telephone_number (tel_number number);
insert into telephone_number values ('0419 853 694');
以上给了你一个答案

ORA-01722:无效号码


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

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

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

正在插入的数据正常。我花了一段时间才发现实际的错误来自于错误索引


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

您可以始终使用TO_NUMBER()函数来删除此错误。这可以作为插入到员工电话号码值中的内容(TO_NUMBER('0419 853 694'))

如果执行
插入到…select*from…
语句,也很容易得到“Invalid Number”错误

假设您有一个名为
FUND\u ACCOUNT
的表,它有两列:

AID_YEAR  char(4)
OFFICE_ID char(5)
假设您希望将OFFICE_ID修改为数字,但表中存在行,更糟糕的是,其中一些行的OFFICE_ID值为“”(空白)。在Oracle中,如果表中有数据,则无法修改列的数据类型,并且将“”转换为0需要一些技巧。因此,下面介绍了如何执行此操作:

  • 创建一个重复的表:
    Create table FUND\u ACCOUNT2 AS SELECT*FROM FUND\u ACCOUNT;
  • 从原始表中删除所有行:
    Delete from FUND_ACCOUNT;
  • 一旦原始表中没有数据,请更改其“办公室ID”列的数据类型:
    alter table FUND\u ACCOUNT MODIFY(办公室ID号);

  • 但还有一个棘手的部分。由于某些行包含空白的OFFICE\u ID值,如果您执行一个简单的
    插入到FUND\u ACCOUNT SELECT*FROM FUND\u ACCOUNT2
    ,您将得到“ORA-01722 Invalid Number”错误。为了将“”(空白)OFFICE\u ID转换为0,您的INSERT语句必须如下所示:


  • 插入基金账户(援助年,办公室ID)选择援助年,从基金账户2解码(办公室ID',0,办公室ID;

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

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


    但是,问题通常在一开始并不明显。帮助我排除故障、查找并修复问题。提示:查找将字符串显式或隐式转换为数字的位置。(我的代码中有
    NVL(number\u field,'string')

    如果出现无效数字错误,请尝试此操作

    在这个 a、 emplid是数字,b.emplid是一个varchar2,所以如果要转换其中一条边

    where to_char(a.emplid)=b.emplid也可以是:

    SELECT t.col1, t.col2, ('test' + t.col3) as test_col3 
    FROM table t;
    
    在oracle中,用于连接的运算符是
    |
    而不是
    +


    在这种情况下,您会得到:
    ORA-01722:无效数字…

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

    我有一个疑问:

    从acc_num介于1001000和1001999之间的帐户中选择max(acc_num);

    那一个出现了一个问题:
    错误:ORA-01722:无效号码

    我刚刚包围了“数值”值,使它们成为“字符串”,只是将它们显式分隔为

    从acc_num介于“1001000”和“1001999”之间的帐户中选择max(acc_num);

    …瞧,它返回了预期的结果

    编辑: 事实上:我的表中的col
    acc_num
    被定义为
    String
    。虽然不是数字,但报告了
    无效数字。字符串数字的显式定界解决了问题

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

    从表中选择最大值(字符串列)

    从表中选择string_column,其中string_column介于“2”和“z”之间

    从字符串列“1”所在的表中选择字符串列


    从string\u column所在的表中选择string\u column这也发生在我身上,但问题实际上不同:文件编码SELECT t.col1, t.col2, ('test' + t.col3) as test_col3 FROM table t;