SpringBoot项目从mysql数据源改造为kingbase数据源的一些常见sql问题
函数xxx不是唯一的
类比这种报错,一般是参数的类型不对问题,例如这次的报错 TIMEDIFF(varchar,datetime)
查询官方文档,地址如下
https://help.kingbase.com.cn/v8/development/sql-plsql/sql/index.html
发现TIMEDIFF()函数的定义为:
而我们代码中函数认为第一个参数是varchar 所以参数类型不对造成了这次的报错,那么我们的目标就是让sql把第一个参数类型识别为data、timestamp、time的其中一个即可。
有两种解决方案:
- 在参数值后面加上 参数值::date 这种进行强行转换
- 使用函数CAST(参数值 AS 转换的类型) 进行转换
示例:
TIMEDIFF(start_date::date,end_time::date)
TIMEDIFF(CAST(start_date AS DATE),CAST(end_time AS DATE))
函数xxx不存在
这种不存在的函数,一般是因为兼容模式导致部分函数不支持,也可能是缺少插件,也可能是本身kingbase就不存在的函数,故根据不同情况有不同的解决方案
1. 兼容模式导致的函数不支持
这种情况需要上官方文档中进行查询,官方文档地址:
https://help.kingbase.com.cn/v8/development/sql-plsql/sql/index.html
注意自己的数据库的兼容模式,执行sql:show database_mode;
根据自己的数据源兼容模式,去查询对应的函数,看是否存在满足需求的函数,如不存在,则需要找人大金仓的技术支持确认并询问是否需要增加插件
2. 缺少插件
我们可以找人大金仓的技术支持确认,也可以自己上官方文档上寻找看是否有自己需要的插件
官方插件文档地址:https://help.kingbase.com.cn/v8/development/sql-plsql/ref-extended-plug-in/index.html
插件的安装分两种:
第一种较为简单,直接使用sql命令安装插件。
CREATE EXTENSION 插件名称;
第二种在执行sql命令前需要对kingbase进行配置,找到kingbase的data目录,对kingbase.conf进行编辑,如果是linux环境直接vim kingbase.conf
在最后部分找到 shared_preload_libraries 在后面追加上需要的插件,多个插件逗号隔开
shared_preload_libraries = 'liboracle_parser, libmysql_parser, synonym, plsql, force_view, plugin_debugger, plsql_plugin_debugger, kdb_ora_expr, sepapower, dblink, sys_kwr, sys_spacequota, s