Обработка ситуации "Данные не найдены" в 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;
→ Ссылка