我有一个随机生成的问题(在千分之一的调用之间发生一次)。错误 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
答案 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'
这可能是您问题的根本原因,因为您希望其中包含数字,但实际上可能包含任何字符串。