select * from  a@o32 left join b@o32 on a.id=b.id 返回如图错误

起初以为是DBlink的错误,经查询

首先,单个表查询的时候,都没有问题,表连接时返回错误

经查询资料及表结构信息:

a.id为number类型,b.id为varchar类型,如果b.id为'1'数字的varchar,oracle可以将varchar类型的1自动转化为number类型的1去做匹配,如果b.id为'2,3',则oracle无法自动转化为number类型,就会报 ORA-01722:无效数字的错误。

因生产环境是相同的sql没有报错,测试环境报错,猜测可能存在脏数据。经查询测试环境的b.id存在无法转换成number类型的值,生产环境不存在无法转换成number类型的值,处理测试环境脏数据后,可正常使用,两个错误都没有了。

总结:

若表连接出现ORA-01722:无效数字错误,先查看单表查询是否正常,若单表查询正常,再查看on链接条件的值数据类型是否一致,看是否是表结构定义有问题,还是数据有问题。另外,oracle可以自动将varchar转化为number类型,而无法将number类型转化为varchar类型。

处理问题中遇到一个之前不知道的小知识:

instr('','||b.id||','','||a.id||',')>0

表示b.id中包含a.id,类似模糊查询 b.id like '%a.id%'

前后都加逗号的原因:

b.id=122,223,78,98 时,若前后加逗号, a.id=2时,无法与b.id匹配,若前后不加逗号,a.id=2时,可以与b.id匹配上。

ORA-01722:无效数字 +ORA-02063:紧接着line(起自O32_UAT) _生产环境