Ao trabalhar com funções no Postgresql é comum ter o retorno:
ERROR: control reached end of function without RETURN ao executar a função.
Esse erro ocorre quando sua função não está tratando todos os tipos de retorno, exemplo:
CREATE TABLE tabela (numero integer);
INSERT INTO tabela (numero) VALUES (1);
create or replace function nomefuncao()
RETURNS text
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
DECLARE
r_numero integer;
BEGIN
select numero into r_numero from tabela;
IF r_numero = 1 THEN
RETURN 'numero um';
END IF;
select nomefuncao() ;
nomefuncao
------------
numero um
(1 registro)
Nesse exemplo como o valor retornado atende o return da função, retornou corretamente.
Agora se eu fizer um update alterando o valor para 2, não existe um tratamento de return para esse retorno, então será exibido o erro:
update tabela set numero=2;
select nomefuncao() ;
ERROR: control reached end of function without RETURN
CONTEXTO: PL/pgSQL function nomefuncao()
Para correção, nessa função posso colocar um outro if ou ate mesmo um else:
create or replace function nomefuncao()
RETURNS text
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
DECLARE
r_numero integer;
BEGIN
select numero into r_numero from tabela;
IF r_numero = 1 THEN
RETURN 'numero um';
END IF;
IF r_numero = 2 THEN
RETURN 'numero dois';
ELSE
RETURN 'qualquer outro numero alem de um ou dois';
END IF;
Faça o teste:
select nomefuncao();
nomefuncao
------------
numero dois
(1 registro)
Outro teste:
update tabela set numero=3;
select nomefuncao() ;
nomefuncao
------------------------------------------
qualquer outro numero alem de um ou dois
(1 registro)
Dessa maneira tratamos todos os retornos.