PostgreSQL创建自定义函数后调用提示function does not exist如何解决
问题原因
PostgreSQL对标识符的大小写处理有明确规则:
- 未用双引号包裹的标识符,会被自动转换为小写处理
- 用双引号包裹的标识符,会严格保留创建时的大小写
你创建函数时使用了public."SampledImpCountToOriginal"写法,双引号强制保留了驼峰格式的函数名;但调用时写的SampledImpCountToOriginal没有加双引号,PostgreSQL会自动转为全小写的sampledimpcounttooriginal去匹配,自然找不到对应函数。
解决方案
有两种可行方案,优先推荐第二种,更符合PostgreSQL开发规范:
方案1:调用时加双引号匹配大小写
调用时给函数名加上双引号即可正确匹配,示例语句:
SELECT public."SampledImpCountToOriginal"(5);
如果你的search_path已经包含public schema,也可以省略schema前缀:
SELECT "SampledImpCountToOriginal"(5);
方案2:重建函数去掉双引号
删除原有函数后,用不带双引号的语句重新创建,后续调用无需加双引号,使用更方便:
-- 先删除原有函数 DROP FUNCTION public."SampledImpCountToOriginal"(IN integer); -- 重新创建,函数名不使用双引号,会自动转为小写存储 CREATE FUNCTION public.sampledimpcounttooriginal(IN integer) RETURNS numeric LANGUAGE 'plpgsql' AS $BODY$ BEGIN RETURN CASE WHEN $1 > 4 THEN EXP(POW($1 - 1.88, 1/2.3)) ELSE $1 END; END; $BODY$;
重建后就可以直接用常规方式调用:
SELECT sampledimpcounttooriginal(5);
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

