案例背景
本文将分享江西移动公司在数据库国产化过程中的应用改造案例:BPMP系统应用程序在适配磐维数据库中,使用了instr函数并出现报错。本次分享的案例记录了从发现问题到解决的全过程以及一些解决思路,意在为读者提供在改造过程中遇到此类问题的解决思路。
环境描述
出问题的环境信息
OS版本:BCLinux for Euler 21.10 (LTS-SP2)
DB版本:panweidb 3.0.0
问题描述
该问题是由业务最先在应用程序发现的,instr函数在磐维数据库运行出错,报错如下:ERROR: function instr(text, unknown, integer, bigint) does not exist。
程序代码显示如下:

问题分析
报错结果显示:“没有找到与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换”。根据报错提示,分以下几步分析问题:
1、让业务提供报错的SQL,然后在数据库执行看是否会报错,结果如下:

通过上一步确认了这个报错是个共性问题,那么就开始根据错误提示去验证函数是否存在
2、通过简单的例子验证instr这个函数是否存在,结果图如下

通过上一步确认了函数是存在的,那么可以根据错误提示去验证加上显示转换是否可行
3、根据SQL中使用的代码,添加显示转换(xxx::text rownum::integer),SQL运行成功。


分析结论
此函数是在磐维数据库是存在且可用的,但是在部分SQL中需要添加显示转换
此类问题处理思路
该问题是由业务开发人员在做应用代码适配磐维数据库的过程中发现的。像此类问题的解决一般可以分为以下几步:
- 判断问题是否为共性问题:先让业务给出源代码,再去数据库执行。此步是为了判断报错是由程序还是数据库引起的。如果在数据库可以执行,那就说明要从程序代码层面去找问题。
- 根据错误提示分析:如果数据库执行也出了问题,那么可以根据错误提示去判断问题问题的原因,像这种函数问题,一般就是几种情况:
- 数据本身不支持此函数
- 如果是从其他数据迁移到磐维的话,函数用法会有差别,本次用到的函数就是有差别。
- 如果是从其他数据迁移到磐维的话,该函数可能没有做适配,但是磐维本身有类似的函数,像本次的instr函数,在磐维中有一个strpos函数与之类似。

- 修复问题:找到原因后,对错误SQL进行修改,在数据库验证无误后提交给业务在程序测试。
最后修改时间:2024-10-24 18:42:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




