如何使用 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 插入一行并返回 *的主要内容,如果未能解决你的问题,请参考以下文章

返回查询时如何退出plpgsql函数

尝试使用 RETURNING 和更新/插入从 plpgsql 函数返回时出错

如何从plpgsql中的循环返回结果?

在 plpgsql 中,如何从返回记录的函数中退出

如何分析 plpgsql 过程

如何在 Postgres/plpgsql 的视图定义中使用变量