You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL创建自定义函数时Sum函数提示无效类型名称,求排查?

问题分析与修正

你的函数存在三个关键错误,导致了报错和功能异常:

1. DECLARE语句位置错误

在PL/pgSQL语法中,DECLARE变量声明块必须放在BEGIN关键字之前,不能嵌套在BEGIN内部。你把变量声明写在了BEGIN里,这会让PostgreSQL误解析语法,进而触发「Sum function is an invalid type name」的错误。

2. 返回变量名拼写错误

你在函数内定义的结果变量是total_time_rented,但最后RETURN的是total_rental_time——这个变量并未定义,执行时会触发未定义变量的报错。

3. 未处理SUM返回NULL的情况

如果指定的category_id没有匹配的记录,SUM(total_rental_time)会返回NULL,直接拼接字符串会得到'NULL Days'的不合理结果,应该用COALESCE将NULL转为0。


修正后的完整代码

CREATE FUNCTION readable_date_time_format (cat_id INT)
RETURNS VARCHAR(11)
LANGUAGE plpgsql
AS $$
DECLARE
    rental_num INT;
    total_time_rented VARCHAR(11);
BEGIN
    SELECT COALESCE(SUM(total_rental_time), 0)
    INTO rental_num
    FROM rental_instances
    WHERE category_id = cat_id;

    total_time_rented = CONCAT(rental_num, ' Days');
    RETURN total_time_rented;
END;
$$;

额外优化建议

  • 如果total_rental_time是时间间隔类型(比如INTERVAL),可以用TO_CHAR直接格式化结果,比手动拼接更规范:TO_CHAR(SUM(total_rental_time), 'DD "Days" HH24:MI')。
  • 可以将函数简化为纯SQL函数,性能更优:
CREATE FUNCTION readable_date_time_format (cat_id INT)
RETURNS VARCHAR(11)
LANGUAGE sql
AS $$
    SELECT CONCAT(COALESCE(SUM(total_rental_time), 0), ' Days')
    FROM rental_instances
    WHERE category_id = cat_id;
$$;

内容的提问来源于stack exchange,提问作者Whitney Fisher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:27:16