在SELECT语句中如何将表列值传入plpgsql自定义函数
问题解答
这种用法完全可行,逻辑和你熟悉的SELECT中嵌入CASE表达式完全一致,都是逐行读取对应列的值输入函数,返回结果作为输出列,你执行报错几乎都是标识符匹配规则导致的问题。
报错的核心原因
PostgreSQL对标识符的大小写有默认处理规则:
- 没有用双引号包裹的标识符(包括函数名、表名、列名),PostgreSQL会自动转为全小写存储和匹配
- 你定义函数时没有用双引号包裹
myCustomFunction,实际数据库中存储的函数名是mycustomfunction - 你调用函数时写了
"myCustomFunction",双引号会强制PostgreSQL严格匹配大小写,自然找不到对应的函数,触发报错
正确写法
方案1:调用时不加双引号(最常用)
函数定义保持不变,调用时去掉函数名的双引号即可,PostgreSQL会自动转小写匹配到已定义的函数:
SELECT t.col1, myCustomFunction(t.col2) AS processed_col2 FROM tbl t WHERE t.col1 = 'someCondition';
方案2:定义和调用都加双引号
如果你需要保留函数名的大小写格式,定义函数时也加上双引号即可:
-- 定义时加双引号保留大小写 CREATE OR REPLACE FUNCTION "myCustomFunction"(myArg text) RETURNS text AS $$ DECLARE BEGIN RETURN UPPER(myArg); END $$ LANGUAGE plpgsql; -- 调用时也加双引号严格匹配 SELECT t.col1, "myCustomFunction"(t.col2) AS processed_col2 FROM tbl t WHERE t.col1 = 'someCondition';
其他可能的报错排查点
如果调整引号规则后依然报错,可检查两点:
- 传入的列
col2的类型是否和函数定义的参数类型兼容,不兼容的类型需要手动加类型转换 - 函数所属的schema是否在当前用户的search_path中,不在的话需要写全
schema名.函数名调用
内容的提问来源于stack exchange,提问作者PainIsAMaster
相关产品推荐
相关产品推荐

