/*
Eu uso bigint  sugerido por Oswaldo e na hora da apresentação uso
essas duas functions:
Detalhe não valida os cpf apenas mascara
*/

DROP FUNCTION IF EXISTS sp_formataCPF(cpf_bigint BIGINT);
CREATE OR REPLACE FUNCTION sp_formataCPF (cpf_bigint BIGINT) RETURNS TEXT AS $$
--OBS: Essa function nao faz a validacao do CPF, apenas formata para o
modo texto.
DECLARE
        cpf_text  TEXT;
BEGIN

     IF LENGTH(CAST (cpf_bigint AS TEXT))  <= 11 THEN
        cpf_text := REPEAT('0', 11-LENGTH(CAST (cpf_bigint AS TEXT)))
|| CAST (cpf_bigint AS TEXT); -- efetua a conversao
     ELSE
        cpf_text := 'CPF >11 DIG'; -- caso o cpf ultrapasse os 11 digitos
     END IF;

     RETURN cpf_text; -- Retorna CPF em formato texto

END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION sp_formataCPF(cpf_bigint BIGINT) IS '
Autor: O Peregrino ([email protected])
Function que converte CPF em BIGINT para TEXT.
--OBS: Nao efetua validacao do CPF, excetuando-se caso o CPF
ultrapasse 11 digitos.
--Exemplo de uso:
--SELECT sp_formataCPF(848327462); -- resultado "00848327462"

'
;       


-- adotando polimorfismo da função sp_formataCPF

DROP FUNCTION IF EXISTS sp_formataCPF(cpf_bigint BIGINT, mask BOOLEAN);
CREATE OR REPLACE FUNCTION sp_formataCPF (cpf_bigint BIGINT, mask
BOOLEAN) RETURNS TEXT AS $$
--OBS: Essa function nao faz a validacao do CPF, apenas formata para o
modo texto e adiciona o mascaramento.
DECLARE
        cpf_text  TEXT;
BEGIN

     IF LENGTH(CAST (cpf_bigint AS TEXT))  <= 11 THEN
        cpf_text := REPEAT('0', 11-LENGTH(CAST (cpf_bigint AS TEXT)))
|| CAST (cpf_bigint AS TEXT); -- efetua a conversao
        IF mask THEN
          cpf_text := SUBSTRING(cpf_text FROM 1 FOR 3)
                      || '.'
                      || SUBSTRING(cpf_text FROM 4 FOR 3)
                      || '.'
                      || SUBSTRING(cpf_text FROM 7 FOR 3)
                      || '-'
                      || SUBSTRING(cpf_text FROM 10 FOR 2); -- faz o
mascaramento do cpf
        END IF;
     ELSE
        cpf_text := 'CPF >11 DIG'; -- caso o cpf ultrapasse os 11 digitos
     END IF;

     RETURN cpf_text; -- Retorna CPF em formato texto

END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION sp_formataCPF(cpf_bigint BIGINT, mask BOOLEAN) IS '
Autor: O Peregrino ([email protected])
Function que converte CPF em BIGINT para TEXT com opcao para adicionar mascara.
--OBS: Nao efetua validacao do CPF, excetuando-se caso o CPF
ultrapasse 11 digitos.
--Exemplo de uso:
--SELECT sp_formataCPF(848327462,TRUE); -- resultado "008.483.274-62"
'
;       



Em 8 de novembro de 2010 16:50, Osvaldo Kussama
<[email protected]> escreveu:
> Em 8 de novembro de 2010 17:39, Marcone <[email protected]> escreveu:
>> No meu caso eu já uso o char, pq com campos numéricos não serão
>> guardados os zeros à esquerda. Se você for usar o mesmo campo para
>> armazenar CPF e CNPJ os zeros à esquerda podem transformar um CNPJ em
>> um CPF (verificações à parte). Eu já tive trabalho com isso e não
>> recomendo campos numéricos para CPF/CNPJ.
>>
>
>
> Creio que você está fazendo uma confusão entre o formato de
> armazenamento e o formato de exibição.
> O número 1 = 01 = 001 etc,  a cadeia de caracteres "1" realmente é
> diferente de "01" ou "001" mas tanto o CPF quanto o CNPJ são códigos
> numéricos, ou seja, zeros a esquerda não alteram seu significado.
>
> Osvaldo
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a