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

时间:2012-01-03 04:37:50

标签: postgresql plpgsql

在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需要RETURN QUERY或RETURN NEXT - 似乎没有办法退出该功能。

1 个答案:

答案 0 :(得分:7)

如果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 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