в plpgsql, как выйти из функции, возвращающей записи - PullRequest
6 голосов
/ 03 января 2012

в 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 - кажется, нет никакого способа просто выйти из функции.

1 Ответ

7 голосов
/ 03 января 2012

Если p_i < 0 на самом деле ошибка, вы можете вызвать исключение :

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;

Из руководства по штрафе :

39.6.1.2.RETURN NEXT и RETURN QUERY
[...]
отдельные возвращаемые элементы определяются последовательностью команд RETURN NEXT или RETURN QUERY, а затем командой final 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
...