Вы можете проверить специальную переменную FOUND типа boolean. Из документации:
FOUND начинает false в каждом вызове функции PL / pgSQL. Он устанавливается каждым из следующих типов утверждений:
Оператор SELECT INTO устанавливает FOUND true, если назначена строка, и false, если строка не возвращается.
Оператор PERFORM устанавливает FOUND true, если он создает (и отбрасывает) одну или несколько строк, и false, если строка не создается.
Операторы UPDATE, INSERT и DELETE устанавливают FOUND true, если затронута хотя бы одна строка, и false, если строка не затрагивается.
Инструкция FETCH устанавливает FOUND true, если возвращает строку, и false, если строка не возвращается.
Оператор MOVE устанавливает FOUND true, если он успешно перемещает курсор, в противном случае - false.
Оператор FOR или FOREACH устанавливает FOUND true, если он повторяется один или несколько раз, в противном случае - false. FOUND устанавливается таким образом при выходе из цикла; внутри выполнения цикла FOUND не изменяется оператором цикла, хотя он может быть изменен выполнением других операторов в теле цикла.
Операторы RETURN QUERY и RETURN QUERY EXECUTE устанавливают FOUND true, если запрос возвращает хотя бы одну строку, и false, если строка не возвращается.
Другие операторы PL / pgSQL не изменяют состояние FOUND. В частности, обратите внимание, что EXECUTE изменяет вывод GET DIAGNOSTICS, но не меняет FOUND.
FOUND - локальная переменная в каждой функции PL / pgSQL; любые изменения в ней влияют только на текущую функцию.
select into
который не возвращает данных, все равно вызовет исключение, верно?