Você pode examinar uma variável especial FOUND de um tipo booleano. A partir da documentação:
FOUND começa falso dentro de cada chamada de função PL / pgSQL. É definido por cada um dos seguintes tipos de instruções:
Uma instrução SELECT INTO define FOUND true se uma linha for atribuída, false se nenhuma linha for retornada.
Uma instrução PERFORM define FOUND true se produzir (e descartar) uma ou mais linhas, false se nenhuma linha for produzida.
As instruções UPDATE, INSERT e DELETE configuram FOUND true se pelo menos uma linha for afetada, false se nenhuma linha for afetada.
Uma instrução FETCH define FOUND true se retornar uma linha, false se nenhuma linha for retornada.
Uma instrução MOVE define FOUND true se ela reposicionar o cursor com êxito, false caso contrário.
Uma instrução FOR ou FOREACH define FOUND true se iterar uma ou mais vezes, ou false. FOUND é definido desta maneira quando o loop sai; dentro da execução do loop, FOUND não é modificado pela instrução do loop, embora possa ser alterado pela execução de outras instruções no corpo do loop.
As instruções RETURN QUERY e RETURN QUERY EXECUTE configuram FOUND true se a consulta retornar pelo menos uma linha, false se nenhuma linha for retornada.
Outras instruções PL / pgSQL não alteram o estado de FOUND. Observe, em particular, que EXECUTE altera a saída de GET DIAGNOSTICS, mas não altera ENCONTRADO.
FOUND é uma variável local dentro de cada função PL / pgSQL; quaisquer alterações afetam apenas a função atual.
select into
que não retorna dados ainda gera uma exceção, certo?