如何使用 plpgsql 插入一行并返回 *
Posted
技术标签:
【中文标题】如何使用 plpgsql 插入一行并返回 *【英文标题】:How can I insert a row and return * with plpgsql 【发布时间】:2021-12-05 02:59:15 【问题描述】:这是我第一次弄乱 plpgsql,我有以下几点:
create or replace function create_marker(title text, description text, latitude decimal, longitude decimal)
returns record
language plpgsql
as $$
declare
res record;
begin
INSERT INTO markers (
title,
description,
latitude,
longitude,
geometry
) VALUES
('marker 1', 'this is marker1 1 description', 10, -100, ST_SetSRID(ST_MakePoint(10, -100), 4326))
RETURNING * into res;
end;
$$;
但我得到一个错误:
a column definition list is required for functions returning "record"
我该如何解决这个问题?
我希望能够做这样的事情:
SELECT * FROM create_marker(...)
【问题讨论】:
需要为返回RECORD
类型的函数指定OUT
参数。或者只使用markers
而不是record
你能解释一下“或者只是使用标记而不是记录”的意思吗?抱歉,今天是我使用 plpgsql 的第一天..
你为什么要使用 plpgsql?将其设为LANGUAGE SQL
函数。
在您的代码中将record
替换为markers
。并且不要忘记函数末尾的return res;
。
【参考方案1】:
您可以使用cte 的RETURNING
子句:
create or replace function create_marker(title text, description text, latitude decimal, longitude decimal)
returns record
language sql
as $$
WITH list AS
(
INSERT INTO markers (
title,
description,
latitude,
longitude,
geometry
) VALUES
('marker 1', 'this is marker1 1 description', 10, -100, ST_SetSRID(ST_MakePoint(10, -100), 4326))
RETURNING *
)
SELECT *
FROM list ;
$$
【讨论】:
以上是关于如何使用 plpgsql 插入一行并返回 *的主要内容,如果未能解决你的问题,请参考以下文章