/*
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