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

PostgreSQL中如何通过存储过程/函数使用自定义类型插入数据?

在PostgreSQL中通过存储过程以自定义数据类型作为参数插入数据的解决方案

错误原因

你遇到的ERROR: relation "in_point" does not exist错误,是因为在存储过程的SELECT语句中,把复合类型参数in_point当成了数据库表(关系)来查询,但in_point只是一个复合类型的变量,并非实际存在的表,因此PostgreSQL无法找到对应的关系对象。

解决方案

针对这个问题,有几种简洁的修改方式,都能直接通过自定义数据类型参数完成插入:

方法1:直接提取复合类型字段插入

直接访问复合类型参数的内部字段,用VALUES子句完成插入:

CREATE OR REPLACE procedure tooldb.point_insert(
    in_point tooldb.point
)
LANGUAGE plpgsql AS  $$
BEGIN
    INSERT INTO tooldb.points (firstpoint, lastpoint)
    VALUES (in_point.firstpoint, in_point.lastpoint);
END  $$;

方法2:通过临时行转换实现SELECT插入

如果需要用SELECT语法,可以将复合类型参数转换为临时行数据,再提取字段:

CREATE OR REPLACE procedure tooldb.point_insert(
    in_point tooldb.point
)
LANGUAGE plpgsql AS  $$
BEGIN
    INSERT INTO tooldb.points (firstpoint, lastpoint)
    SELECT firstpoint, lastpoint FROM (VALUES(in_point)) AS t(p);
END  $$;

方法3:批量提取复合类型所有字段

如果复合类型的字段和目标表的字段完全匹配,可以用(变量名).*一次性提取所有字段,简化代码:

CREATE OR REPLACE procedure tooldb.point_insert(
    in_point tooldb.point
)
LANGUAGE plpgsql AS  $$
BEGIN
    INSERT INTO tooldb.points (firstpoint, lastpoint)
    SELECT (in_point).*;
END  $$;

验证调用

修改完成后,执行原调用语句即可成功插入数据:

CALL tooldb.point_insert((3,5));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:35:37