sábado, 28 de dezembro de 2019

PostgreSQL: ERROR: control reached end of function without RETURN

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;

END;
$BODY$;

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;

END;
$BODY$;

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.