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
相关产品推荐
相关产品推荐

