【问题标题】:Returning multiple values in a function在函数中返回多个值
【发布时间】:2015-12-14 06:33:47
【问题描述】:

我最近才开始涉足 PostgreSQL,并且一直在构建函数来处理必要的任务。

有一个名为 queue 的表,其中添加了状态为“New”的新任务。下面的函数应该更新这些新任务并返回它们的 queueid 列值,它们是 bigint 序列。由于可能没有一个或多个任务,因此我也需要能够返回一个或多个值。

返回这些值让我碰壁了。我一直在谷歌搜索答案,但还没有成功。在最新的实验中,我尝试使用 OUT 变量并将结果分配给它,但显然 INTO 无法将值正确分配到数组中,而且我还没有弄清楚如何使它工作。

请帮帮我。 :) 非常感谢。

CREATE OR REPLACE FUNCTION assign_task(
  IN worker text,
  OUT id bigint[])
 RETURNS bigint[] AS
$BODY$BEGIN
 EXECUTE 'UPDATE queue
  SET status = ''In progress'', worker = $1
  WHERE status = ''New''
  RETURNING queueid'
 INTO id
 using worker;
END;$BODY$
LANGUAGE plpgsql VOLATILE

【问题讨论】:

标签: postgresql


【解决方案1】:

你把事情复杂化了。当您想要返回多个值时,您需要将函数定义为returns tablereturns setof。我更喜欢returns table,因为它还允许您定义结果的列名。

你也不需要 PL/pgSQL,一个带有UPDATE 语句的普通 SQL 函数就足够了:

CREATE OR REPLACE FUNCTION assign_task(IN worker text)
  returns table (id bigint)
as
$BODY$
 UPDATE queue
  SET status = 'In progress', worker = $1
  WHERE status = 'New'
  RETURNING queueid;
$BODY$
LANGUAGE sql VOLATILE;

【讨论】:

  • 谢谢,我确实把事情复杂化了。 :) 我使用 setof 是因为我找不到任何方法在 pgAdmin 中创建返回表的函数。但是 setof 对我的目的来说很好。再次感谢。 :)
  • @KeeperB5:在 pgAdmin 中创建一个返回表的函数与在任何其他客户端中没有什么不同:只需运行适当的 SQL 语句
猜你喜欢
  • 2012-06-06
  • 2019-05-10
  • 2020-05-04
  • 2020-12-17
  • 1970-01-01
  • 2020-12-06
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多