使用HugSQL调用PostgreSQL自定义函数提示不存在如何解决?
问题解决方法
schema搜索路径不匹配
你在DBeaver中登录的数据库用户默认搜索路径(search_path)包含了自定义函数所属的schema,而Clojure代码中使用的数据库连接没有配置对应schema,导致无法找到函数。
两种修复方案:- 调用函数时写全schema限定名,修改SQL文件写法:
select * from 函数所属schema名.a_fake_user_defined_function(:arg1, :arg2, :arg3, :arg4, 1);- 在数据库连接的subname中添加currentSchema参数,示例:
:subname "//数据库地址:端口/库名?currentSchema=函数所属schema名"参数类型不匹配
HugSQL默认将字符串类型的入参转换为character varying类型,如果你同事定义的函数对应参数不是该类型(比如为text、int等),就会触发参数类型不匹配的报错。
修复方案:在SQL中对参数加显式类型转换,匹配函数定义的参数类型即可,示例:
select * from a_fake_user_defined_function(:arg1::text, :arg2::text, :arg3::text, :arg4::text, 1);
- 验证排查方法
可以新增如下查询语句,确认函数的实际参数类型和当前连接的搜索路径,辅助定位问题:
-- :name check-func-info :? :* -- 查看目标函数的参数类型定义 select proname, proargtypes::regtype[] from pg_proc where proname = 'a_fake_user_defined_function'; -- :name check-search-path :? :1 -- 查看当前连接的schema搜索路径 show search_path;
内容的提问来源于stack exchange,提问作者Lucas Moreira
相关产品推荐
相关产品推荐

