在 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 < 0
实际上是一个错误,那么你可以raise an exception:
if p_i < 0 then
raise exception 'Don''t know what to do with %', p_i
end if;
如果p_i < 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 NEXT
或RETURN 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
【讨论】:
空表的好主意。现在根本不返回任何东西 - 有点像返回一个空表 - 并且似乎工作。但就像break
在loop
中非常好,return
将退出function
会很高兴。问题是return
承担两个任务:返回值和退出。
@ccyoung:我遗漏了一些明显的东西,你不需要generate_series
技巧,只需一个简单的return;
就可以了。
如果您执行简单的return
,则会引发错误:必须是 RETURN QUERY 或 RETURN NEXT。让我再检查一下 - 可能已经脑死了。
你完全正确!把简单的回报放在条件下 - 一切都很好。谢谢!以上是关于在 plpgsql 中,如何从返回记录的函数中退出的主要内容,如果未能解决你的问题,请参考以下文章
Postgresql - 从 plpgsql 函数返回记录 []
PLpgSQL:将每条记录存储在 For Loop 中并返回 json
plpgsql 错误:RETURN 在返回 void 的函数中不能有参数