Обработка ситуации "Данные не найдены" в Postgesql
Не могу никак выйти на исключение в функции, хотя данных заведомо нет. Код:
create table t
(
id int,
val int
);
insert into t
values
(1, 1);
-- select * from t;
-- Запрос не возвращает запись
select * from t
where id = 100;
create or replace function f() returns int as
$$
declare
cr integer;
begin
select val into cr
from t
where id = 100;
return cr;
exception
when no_data_found then
return -1;
end
$$
language plpgsql;
select f();
Возвращает null, а не -1. Что-то делаю не так?
Ответы (1 шт):
Автор решения: Мелкий
→ Ссылка
Как можно уточнить в документации, select val into cr не генерирует ошибку. Это штатная ситуация. Нет ошибки - нечего ловить в обработке ошибок.
select val into strict cr
В строгом режиме будет сгенерирована ошибка.
Не рекомендую в pl/pgsql злоупотреблять исключениями. Они под капотом опираются на весьма не бесплатные savepoints, и, что особенно важно, не бесплатные не только при получении ошибки, а замедляющие работу всегда.
Можно написать, например,
create or replace function f() returns int as
$$
declare
cr integer;
begin
select val into cr
from t
where id = 100;
IF NOT FOUND THEN
return -1;
END IF;
return cr;
end
$$
language plpgsql;