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

Posted

技术标签:

【中文标题】在 plpgsql 中,如何从返回记录的函数中退出【英文标题】:in plpgsql, how to exit from a function returning records 【发布时间】:2012-01-03 04:37:49 【问题描述】:

在 postgresql plpgsql 中,

create function f1( p_i int ) returns table( c1 int ) as $$
begin
  -- wish to exit, do not wish to return anything
  if p_i < 0 then
     -- cannot RETURN - since can only return record!
  end if;

  -- continue processing
  return query select c2 from t1 where c1 = p_i;
  ...
end;
$$ language plpgsql;

根据doc,打破函数的唯一方法是返回。但是这里的 RETURN 需要 RETURN QUERY 或 RETURN NEXT - 似乎没有办法简单地退出函数。

【问题讨论】:

如果一个函数(如你的函数)被定义为返回TABLE()SETOF ...,你可以简单地使用RETURN;。您必须考虑返回值且未定义 OUT 参数的函数。 那么你需要返回一个值。 【参考方案1】:

如果p_i &lt; 0实际上是一个错误,那么你可以raise an exception:

if p_i < 0 then
    raise exception 'Don''t know what to do with %', p_i
end if;

如果p_i &lt; 0 应该安静地不返回任何内容,那么您可以执行以下操作:

create or replace function f1( p_i int ) returns table( c1 int ) as $$
begin
    if p_i < 0 then
        return;
    end if;
    return query select c2 from t1 where c1 = p_i;
end;
$$ language plpgsql;

来自fine manual:

39.6.1.2。返回下一个并返回查询 [...] 要返回的单个项目由RETURN NEXTRETURN QUERY 命令序列指定,然后使用不带参数的最终RETURN 命令指示函数已完成执行

强调我的。因此,您可以使用您的 return query 来返回查询,而只需一个简单的 return; 即可退出而无需执行任何操作。

例如,return; 版本给了我这样的东西:

=> select * from f1(-1);
 c1 
----
(0 rows)
=> select * from f1(1);
 c1 
----
  1
  1
  ...
(15 rows)

异常版本会这样做:

=> select * from f1(-1);
ERROR:  Don't know what to do with -1

【讨论】:

空表的好主意。现在根本不返回任何东西 - 有点像返回一个空表 - 并且似乎工作。但就像breakloop 中非常好,return 将退出function 会很高兴。问题是return 承担两个任务:返回值和退出。 @ccyoung:我遗漏了一些明显的东西,你不需要generate_series 技巧,只需一个简单的return; 就可以了。 如果您执行简单的return,则会引发错误:必须是 RETURN QUERY 或 RETURN NEXT。让我再检查一下 - 可能已经脑死了。 你完全正确!把简单的回报放在条件下 - 一切都很好。谢谢!

以上是关于在 plpgsql 中,如何从返回记录的函数中退出的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql - 从 plpgsql 函数返回记录 []

PLpgSQL:将每条记录存储在 For Loop 中并返回 json

plpgsql 错误:RETURN 在返回 void 的函数中不能有参数

从 plpgsql 函数中获取 Java ResultSet 的返回值

在 plpgsql 函数中访问 select 语句结果

plpgsql 专家:(记录集)函数的输入和输出