错误 --> java.sql.SQLSyntaxErrorException: ORA-01722: 无效数字

时间:2021-02-01 14:03:48

标签: java sql oracle dbeaver

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

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

这是我的代码:

    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

1 个答案:

答案 0 :(得分:0)

在将 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' 

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

相关问题