PostgreSQL中如何调用带JSON参数的void返回函数 解决函数不存在报错
PostgreSQL 自定义函数调用报错解决
报错本质
两次报错中数据库检索的目标函数是myschema._add1hidoc,和你创建的myschema._add1不是同一个对象,这是触发“函数不存在”提示的根源。结合场景拆解,问题出在两处:
- 函数名输入错误:实际执行的调用语句误将函数名写为带
hidoc后缀的_add1hidoc(多为手滑输入、粘贴时带入了多余字符导致),数据库自然无法匹配到你创建的_add1函数。 - 入参类型不匹配:你定义的函数第二个入参是
smallint类型,但传入的数字1默认是integer类型。PostgreSQL不会在integer和smallint之间做隐式类型转换,就算函数名写对,也会因为参数类型不匹配触发同类报错。
正确调用语句
完全匹配函数定义的调用写法如下,执行后即可正常完成数据插入:
SELECT myschema._add1( '{"j":["j1", "j2"]}'::json, 1::smallint, '2021-02-26'::date );
注:PostgreSQL中调用返回void的PL/pgSQL函数,直接在外部会话使用
SELECT语法即可,无需使用函数内部专用的PERFORM语法。
排查验证方法
如果执行上述语句仍有报错,可通过系统视图核对myschema下真实存在的函数信息,避免引用错误:
- 拉取所有和
_add1相关的函数定义,确认实际函数名、入参匹配关系:
SELECT n.nspname AS schema, p.proname AS function_name, pg_get_function_arguments(p.oid) AS params FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid WHERE n.nspname = 'myschema' AND p.proname LIKE '%_add1%';
如果查询结果中确实存在带
hidoc后缀的函数,说明你此前误创建了错误命名的函数,且调用时一直引用了这个错误对象,替换为你实际定义的函数名即可解决。
内容的提问来源于stack exchange,提问作者Jeb50
相关产品推荐
相关产品推荐

