PostgreSQL函数altaPlayer不存在报错,请求显式类型转换解决方案
altaPlayer不存在的问题 我完全理解花了两天时间卡在这个错误上有多让人沮丧,咱们一步步拆解问题,找到根源:
首先看你给出的错误信息:
Error: psql:/Samsung/VisualCodeStudioWorkspace/1524335164735.pgsql:95: ERROR: function altaplayer(character varying, integer, integer, character varying, character varying) does not exist
LINE 1: select altaPlayer( varchar 'Drazen Petrovic',52,80, varchar ...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
这个错误核心是PostgreSQL找不到参数类型完全匹配的altaPlayer函数,咱们从几个常见方向排查:
1. 确认函数是否真的存在,且参数类型完全匹配
先跑这条查询,看看数据库里有没有这个函数,以及它的参数类型:
SELECT proname, proargtypes::regtype[] FROM pg_proc WHERE proname ILIKE 'altaplayer'; -- 用ILIKE忽略大小写,排查驼峰/小写问题
- 如果查询结果为空:说明函数根本没创建成功,你需要重新检查函数的创建语句,确保没有语法错误。
- 如果有结果:对比返回的参数类型和你调用时传的类型(
varchar, int, int, varchar, varchar)是否完全一致,哪怕是varchar(20)和varchar这种细微差别都可能导致不匹配。
2. 检查函数名的大小写问题
PostgreSQL默认会把未加双引号的标识符转成小写。如果你创建函数时用了驼峰名比如"altaPlayer"(带双引号),那调用时必须也加双引号,否则会被转成altaplayer,自然找不到函数:
-- 如果创建时是带双引号的,调用要这样写 SELECT "altaPlayer"('Drazen Petrovic', 52, 80, 'XXX', 'YYY');
3. 优化调用语句的类型转换写法
你调用时用的varchar 'Drazen Petrovic'写法虽然合法,但有时候会引发隐性类型匹配问题,建议换成PostgreSQL更常用的显式转换语法:
SELECT altaPlayer( 'Drazen Petrovic'::varchar, 52::integer, 80::integer, '你的球队名'::varchar, '你的位置'::varchar );
4. 确认函数所在的Schema
如果函数不是创建在默认的public Schema下,调用时需要指定Schema前缀,比如:
-- 假设函数在my_schema下 SELECT my_schema.altaPlayer(...);
可以用这条查询找到函数所在的Schema:
SELECT proname, nspname FROM pg_proc JOIN pg_namespace ON pg_proc.pronamespace = pg_namespace.oid WHERE proname ILIKE 'altaplayer';
5. 先确认自定义类型player创建成功
你提到执行了CREATE TYPE player AS ( nom varchar(20...,先确认这个类型已经正确创建:
SELECT typname FROM pg_type WHERE typname = 'player';
如果返回空,说明类型创建失败,需要补全完整的类型定义,比如:
CREATE TYPE player AS ( nom varchar(20), edad integer, altura integer, equipo varchar(20), posicion varchar(20) );
然后再重新创建依赖这个类型的altaPlayer函数。
建议你先按上面的步骤逐一排查,最常见的问题就是函数名大小写不匹配或者参数类型细微差异,先确认函数的存在性和定义是关键。
内容的提问来源于stack exchange,提问作者Eduardo Gutierrez

