quinta-feira, 13 de fevereiro de 2020

PostgreSQL: Formatação de texto

Durante a criação de um select pode se deparar com a necessidade de formatar algum texto.
Exemplo CEP 83709151 formatar para 83.709-151

Para isso você vai usar a function regexp_replace


Onde: ([0-9]{2}) é o primeiro elemento \1 você vai pegar valores numéricos de 0 a 9 e separar os 2 primeiros números. 
E depois do \1 que é o primeiro elemento você coloca . (ponto)
([0-9]{3}) é o segundo elemento \2, que depois dele vai o -

Mesma coisa para formatação de CNPJ:


Para outras formatações de letras segue o mesmo padrão apenas alterando [0-9] para [a-z] ou [A-Z]




Espero ter ajudado

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.