Em 8 de novembro de 2010 18:14, Emerson Hermann
<[email protected]> escreveu:
> /*
> 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.
>>


Apenas para simplificar suas funções de formatação poderiam ser apenas:
SELECT to_char(1234567890,'000"."000"."000"-"00') AS cpf;
SELECT to_char(1234567000199,'00"."000"."000"/"0000"-"00') AS cnpj;

Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a