【问题标题】:ERROR --> java.sql.SQLSyntaxErrorException: ORA-01722: invalid number错误 --> java.sql.SQLSyntaxErrorException: ORA-01722: 无效数字
【发布时间】:2021-02-01 14:03:48
【问题描述】:

我有一个随机生成的问题(在千分之一的调用之间出现一次)。错误ORA-01722:在准备好的语句Oracle数据库中执行sql更新时随机生成无效数字。

虽然我认为我的代码是正确的,但它也显示错误,所以请告诉我我错在哪里。

这是我的代码:

    select *
from 
(
select p.*, SD.GLORGANIZATION
from     EXT.INNOVA_STANDING_ORDER_PAYMENT p , EXT.STANDINGORDER_DEFINITION SD,PRM.PRM_CORP_STANDING_ORDER_DEF SOD
where    p.status=1 and p.transfersequence in (?) and p.sirano=? 
and p.paymentstatus in ( ? ) 
AND P.CORPORATION=SOD.INNOVACODE AND P.SERVICEINFO=SD.SUBSCRIBERNO AND SD.CORPORATECODE=SOD.CODE AND SD.ORDERSTATU IN ('22') AND SD.STATUS=1
AND P.DUEDATE=? and P.CORPORATION not in ('10000','203','500','501','405','213')
union all
select p.*, SD.GLORGANIZATION
from     EXT.INNOVA_STANDING_ORDER_PAYMENT p , EXT.STANDINGORDER_DEFINITION SD,PRM.PRM_CORP_STANDING_ORDER_DEF SOD
where    p.status=1 and p.transfersequence in (?) and p.sirano=? 
and p.paymentstatus in ( ? ) 
AND P.CORPORATION=SOD.INNOVACODE AND P.SERVICEINFO=SD.SUBSCRIBERNO2 || SD.SUBSCRIBERNO AND SD.CORPORATECODE=SOD.CODE AND SD.ORDERSTATU IN ('22') AND SD.STATUS=1
AND P.DUEDATE=? and P.CORPORATION  in ('203','213','221')
union all
select p.*, SD.GLORGANIZATION 
from     EXT.INNOVA_STANDING_ORDER_PAYMENT p , EXT.STANDINGORDER_DEFINITION SD,PRM.PRM_CORP_STANDING_ORDER_DEF SOD
where    p.status=1 and p.transfersequence in (?) and p.sirano=? 
and p.paymentstatus in ( ? ) 
AND P.CORPORATION=SOD.INNOVACODE AND P.SERVICEINFO=SD.SUBSCRIBERNO AND
P.CORPACCOUNTID=SD.CORPACCOUNTID AND
SD.CORPORATECODE=SOD.CODE AND SD.ORDERSTATU IN ('22') AND SD.STATUS=1
AND P.DUEDATE=? and P.CORPORATION  in ('500','501')
union all
select p.*, SD.GLORGANIZATION 
from     EXT.INNOVA_STANDING_ORDER_PAYMENT p , EXT.STANDINGORDER_DEFINITION SD,PRM.PRM_CORP_STANDING_ORDER_DEF SOD
where    p.status=1 and p.transfersequence in (?) and p.sirano=? 
and p.paymentstatus in ( ? ) 
AND P.CORPORATION=SOD.INNOVACODE AND P.SERVICEINFO=SD.SUBSCRIBERNO AND 
P.SERVICEINFO2=to_number(SD.SUBSCRIBERNO2) AND SD.CORPORATECODE=SOD.CODE AND SD.ORDERSTATU IN ('22') AND SD.STATUS=1
AND P.DUEDATE=? and P.CORPORATION  in ('405') AND SD.CORPORATECODE='405'
union all
select p.*, SD.GLORGANIZATION 
from ( SELECT iso.* 
FROM EXT.INNOVA_STANDING_ORDER_PAYMENT iso
WHERE iso.CORPORATION IN('10000')
ORDER BY iso.billnumber )p, EXT.STANDINGORDER_DEFINITION SD, PRM.PRM_CORP_STANDING_ORDER_DEF SOD
WHERE p.status = 1
AND P.CORPORATION = SOD.INNOVACODE
AND P.SERVICEINFO = SD.SUBSCRIBERNO
AND P.SERVICEINFO2 = TO_NUMBER( SD.SUBSCRIBERNO2 )
AND SD.CORPORATECODE = SOD.CODE
AND SD.ORDERSTATU IN('22')
AND SD.STATUS = 1
AND P.CORPORATION IN('10000'))q

【问题讨论】:

  • 此错误发生在您尝试将字符串转换为数字时,字符串无法转换为数字

标签: java sql oracle dbeaver


【解决方案1】:

在将 varchar 值转换为数字期间可能会引发“ORA-01722:无效数字”错误。 通常,如果您使用 '1,234' 而不是 '1.234',通常会出现问题。

例如:

select to_number('1,234') from dual;  -- ORA-01722 error 
select to_number('1.234') from dual;  -- correct 

为了解决您的问题,您需要检查查询源表中的数字数据。

还请注意,可以在没有 to_number() 的情况下执行到数字的转换。如果您在 2 种不同数据类型之间使用操作,则其中一种可能会隐式转换为另一种数据类型。

例如

select * 
from some_table 
where name +1 = 2;

name 是 VARCHAR 字段,应转换为 NUMBER 类型以执行 +1 操作。在查询计划中,您将看到 TO_NUMBER() 操作。

filter(TO_NUMBER("NAME")+1=2)

在您的查询中有很多数字,例如“405”。看起来你有数字列的 VARCHAR 类型。

SD.CORPORATECODE='405' 

这可能是您问题的根本原因,因为您希望其中有数字,但实际上可能有任何字符串。

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 2018-02-14
    • 2020-09-21
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2021-10-30
    • 2021-05-03
    相关资源
    最近更新 更多