错误 --> java.sql.SQLSyntaxErrorException: ORA-01722: 无效号码



我有一个随机生成的问题(在千分之一次调用之间的一次)。错误ORA-01722: invalid number在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

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

例如:

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

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

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

例如

select * 
from some_table 
where name +1 = 2;

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

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

在你的查询中有很多像"405"这样的数字。看起来您为数字列设置了VARCHAR类型。

SD.CORPORATECODE='405' 

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

相关内容

  • 没有找到相关文章

最新更新