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匹配上。