背景
江西移动现场,应用侧在磐维数据库使用instr函数时报错,报错如下:ERROR: function instr(text, unknown, integer, bigint) does not exist
环境描述
出问题的环境信息
OS版本:BCLinux for Euler 21.10 (LTS-SP2) DB版本:panweidb 3.0.0
问题描述
程序代码显示function instr不存在
报错结果显示:“没有找到与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换”。根据报错提示,分以下几步分析问题:
1、让业务提供报错的SQL,然后在数据库执行看是否会报错,结果如下:
通过上一步确认了这个报错是个共性问题,那么就开始根据错误提示去验证函数是否存在
2、通过简单的例子验证instr这个函数是否存在,结果图如下
通过上一步确认了函数是存在的,那么可以根据错误提示去验证加上显示转换是否可行
3、根据SQL中使用的代码,添加显示转换(xxx::text rownum::integer),SQL运行成功。
分析结论
函数是可用的,但是需要添加显示转换
此类问题处理思路
该问题是由业务开发人员在做应用代码适配磐维数据库的过程中发现的。像此类问题的解决一般可以分为以下几步:
- 判断问题是否为共性问题:先让业务给出源代码,再去数据库执行。此步是为了判断报错是由程序还是数据库引起的。如果在数据库可以执行,那就说明要从程序代码层面去找问题。
- 根据错误提示分析:如果数据库执行也出了问题,那么可以根据错误提示去判断问题问题的原因,像这种函数问题,一般就是几种情况:
- 数据本身不支持此函数
- 如果是从其他数据迁移到磐维的话,函数用法会有差别,本次用到的函数就是有差别。
- 如果是从其他数据迁移到磐维的话,该函数可能没有做适配,但是磐维本身有类似的函数,像本次的instr函数,在磐维中有一个strpos函数与之类似。
- 修复问题:找到原因后,对错误SQL进行修改,在数据库验证无误后提交给业务在程序测试。