ORA-01722 原因
ORA-01722 错误是由试图将字符串转换为数字引起的。这可能是因为您的表达式中的数字字符无效,或者您正在尝试将文本值添加到数字列中。
此错误的原因是 Oracle 已尝试将字符串转换为数字,但无法执行转换。
例如,无法将“Hello”的值转换为数字。
有效数字包含以下字符:
- 数字 0 到 9
- 可能是小数点
- 一个 + 或 - 符号
- 一个 E 或 e 字符
解决方法:
- 查询中的字符或错字不正确
- 数据库中的错误数据
- 查询逻辑有问题
原sql语句
select * from (select c.*,lpad(c.fund_account, 19, 0) || lpad(c.exchange_type, 4, '0') || lpad(c.system_no, 4, 0) AS position_str from
(select nvl(a.fund_account,b.fund_account) as fund_account,nvl(a.exchange_type,'!') as exchange_type,nvl(a.uft_sysnode_id,b.uft_sysnode_id) as uft_sysnode_id,
nvl(a.system_no,b.uft_sysnode_id) as system_no,nvl(a.trans_rate,1) as trans_rate,nvl(a.en_exchange_type,'!') as en_exchange_type,
nvl(a.enable_status,b.enable_status) as enable_status,a.remark from uftfundaccountsysno a
right join uftaccountdeploy b on
a.fund_account=b.fund_account) c,
(select str_config from sysconfig where config_no='80014') d
where enable_status=1 and instr('@'||replace(d.str_config,';','@') ||'@','@'||c.uft_sysnode_id||'@') > 0 order by position_str) where (position_str > '@position_str' AND rownum <= @request_num)
问题排查
1、该问题在自己的环境未出现,该sql语句是查询数据并返回合集数据。
2、优先考虑所处的链路和调用关系,链路没问题,调用关系很简单,就是加了额外的入参和本次的sql语句。其他参数并不影响。
3、连接出问题的环境查看数据。并分析。发现两个子表都是有数据,并且对比了一下,应该是可以返回结果集的。
4、拆分sql语句,发现前面的都没问题,直到加上enable_status=1就会报错。结合前面的报错。怀疑是有数据不对。
5、查看该字段,发现有两个数据中该字段为空,这不符合此表的定义的,该表柜台状态必须有值的,不能为空,可能是历史的脏数据。将该字段设置为正常的数值后。再次查询成功返回。
总结
ORA-01722问题优先考虑数据的字段值是否有误。排查方法优先拆分sql语句确认是哪一条引起的问题。