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
