sexta-feira, 25 de julho de 2008

Validação de CPF - Algoritmo Sem Loops

O algoritmo para validação de CPF pode ser implementado sem loops. A solução alternativa que aparece convertida para Pl/ PgSQL foi retirada do site do Clube do Hardware, com alguns ajustes. O código ficou bem pequeno e os loops foram trocados por operações com vetores. Observe que no PostgreSQL os vetores começam a partir da posição zero.

O código aparece abaixo:

-- Formatar CPF com vetor
CREATE OR REPLACE FUNCTION CPF_Validar_Sem_Loop(par_cpf varchar(11)) RETURNS integer AS $$
-- ROTINA DE VALIDAÇÃO DE CPF SEM LOOP
-- Conversão para o PL/ PGSQL: Cláudio Bezera Leopoldino - http://postgresqlbr.blogspot.com/
-- Algoritmo original: http://forum.clubedohardware.com.br/validacao-cpf/51717
-- Retorna 1 para CPF correto.
DECLARE
vet_cpf integer [11]; --Recebe o CPF DIGITADO
dv integer; -- Primeiro número do DV (Dígito Verificador)
dv1 integer; -- Segundo número do DV (Dígito Verificador)
soma integer; -- Soma utilizada para o cálculo do DV
rest integer; -- Resto da divisão
BEGIN
IF char_length(par_cpf) = 11 THEN
ELSE
RAISE NOTICE 'Formato inválido: %',$1;
RETURN 0;
END IF;
-- Atribuição dos valores do Vetor
vet_cpf[0] := cast(substring (par_cpf FROM 1 FOR 1) as integer);
vet_cpf[1] := cast(substring (par_cpf FROM 2 FOR 1) as integer);
vet_cpf[2] := cast(substring (par_cpf FROM 3 FOR 1) as integer);
vet_cpf[3] := cast(substring (par_cpf FROM 4 FOR 1) as integer);
vet_cpf[4] := cast(substring (par_cpf FROM 5 FOR 1) as integer);
vet_cpf[5] := cast(substring (par_cpf FROM 6 FOR 1) as integer);
vet_cpf[6] := cast(substring (par_cpf FROM 7 FOR 1) as integer);
vet_cpf[7] := cast(substring (par_cpf FROM 8 FOR 1) as integer);
vet_cpf[8] := cast(substring (par_cpf FROM 9 FOR 1) as integer);
vet_cpf[9] := cast(substring (par_cpf FROM 10 FOR 1) as integer);
vet_cpf[10] := cast(substring (par_cpf FROM 11 FOR 1) as integer);
-- CÁLCULO DO PRIMEIRO NÚMERO DO DV
-- Soma dos nove primeiros multiplicados por 10, 9, 8 e assim por diante...
soma:=(vet_cpf[0]*10)+(vet_cpf[1]*9)+(vet_cpf[2]*8)+(vet_cpf[3]*7)+(vet_cpf[4]*6)+(vet_cpf[5]*5)+(vet_cpf[6]*4)+(vet_cpf[7]*3)+(vet_cpf[8]*2);
rest:=soma % 11;
if (rest = 0) or (rest = 1) THEN
dv:=0;
ELSE dv:=(11-rest); END IF;
-- CÁLCULO DO SEGUNDO NÚMERO DO DV
-- Soma dos nove primeiros multiplicados por 11, 10, 9 e assim por diante...
soma:=(vet_cpf[0]*11)+(vet_cpf[1]*10)+(vet_cpf[2]*9)+(vet_cpf[3]*8)+(vet_cpf[4]*7)+(vet_cpf[5]*6)+(vet_cpf[6]*5)+(vet_cpf[7]*4)+(vet_cpf[8]*3)+(dv*2);
rest:=soma % 11;
if (rest = 0) or (rest = 1) THEN
dv1:=0;
ELSE dv1:=(11-rest); END IF;
IF (dv = vet_cpf[9]) and (dv1 = vet_cpf[10]) THEN
RETURN 1;
ELSE
RAISE NOTICE 'DV do CPF Inválido: %',$1;
RETURN 0;
END IF;
END;
$$ LANGUAGE PLPGSQL;

Sintaxe para a chamada da função criada:

SELECT CPF_Validar_Sem_Loop ('número do cpf');

Caso queira relembrar o algoritmo com loops ou ver ais comentários sobre o cálculo de CPF, clique aqui.

sexta-feira, 18 de julho de 2008

Instalação no Linux e Mac com Apenas um Clique!

Estão disponíveis os betas de instaladores para Linux e Mac que permite a instalação com apenas "um clique". A criação destes instaladores foi feita péla equipe do EnterpriseDB. Espera-se que a dificuldade de instalação nestas plataformas seja minimizada.

Os instaladores contém o PostgreSQL 8.3.3 com pgAdmin 1.8.4, pl/Java e o plugin para debug da linguagem pl/pgsql.

O download pode ser feito em:

Linux 32 e 64 bits: http://www.postgresql.org/download/linux

Mac OS X 10.4: http://www.postgresql.org/download/macosx

quarta-feira, 9 de julho de 2008

PostgreSQL: Presença Fraca no Youtube

A presença do PostgreSQL entre os grandes SGBDs pode ser medida de diversas formas. Em busca de vídeos interessantes de PostgreSQL, fiz uma busca no Youtube, e me decepcionei. Encontrei apenas 356 vídeos. É muito pouco para cobrir todas as funcionalidades e possibilidades deste banco de dados.

Considerando-se que este resultado envolve todos os idiomas, os resultados são ainda mais fracos, pois temos muito pouca coisa em Português. A qualidade da imagem também deixa a desejar, possivelmente pelo formato do Youtube, que reduz a resolução e prejudica apresentações que capturam telas do computador e as filmagens de apresentações em telões multimídia. Faltam comentários nos vídeos, a visualização ainda é pequena por parte da comunidade e muitos permanecem sem avaliação (o Youtube tem uma graduação que vai até 5 estrelas). Vi bons vídeos em italiano, mas acho que a estrada a ser trilhada pelo PostgreSQL em vídeo ainda está no seu início.

Para ter uma visão comparativa, fiz outras buscas para outros SGBDs. Entre os bancos de dados livres, apesar do PostgreSQL só estar atrás do MySQL, não se pode dizer que é uma boa colocação. A abrangência, quantidade e qualidade dos vídeos pode melhorar muito. O próprio campeão MySQL teve muito mais resultados encontrados, mas bem abaixo do que poderia ser. O fato é que ainda não utilizamos vídeos como forma de aprendizado e divulgação de conhecimento como poderíamos.

Mesmo os Bancos de Dados proprietários apresentam poucas opções, mas o SQL Server teve quase o dobro de vídeos que o PostgreSQL. O Oracle também decepcionou e pode ser alcançado pelo PostgreSQL com algum trabalho da comuindade.

O ranking total aparece abaixo. Faltam alguns SGBDs, mas o propósito não era uma busca exaustiva. A grande surpresa foi o DB2, com a terceira colocação. Os bancos de dados livres lideram com o MySQL e o PostgreSQL ocupa apenas uma posição intermediária, com o quinto lugar.

1 - MySQL: 1330
2 - SQL Server: 674
3 - IBM DB2: 461
4 - Oracle (busca por "Oracle SQL"): 406
5 -PostgreSQL: 356
6 - Firebird (busca por "Firebird SQL"): 171
7 - ACCESS (busca por "ACCESS SQL"): 50
8 - SQLite: 22
9 - ADABAS: 5
10 - HSQLDB: 0

O que podemos fazer a respeito?

Bom, creio que podemos influir positivamente quanto a esta questão:

- Assistir a vídeos de PostgreSQL no Youtube, dando feedback aos seus criadores, através de comentários e da colocação das estrelas, indicando os melhores. Esta ação permite que se possa estimular a produção de melhores vídeos e o reconhecimento dos autores.
- Postar novos fragmentos de palestras e de cursos com conteúdo novo e diversificados. Muitos eventos de Software Livre, de Banco de Dados em Geral e de PostgreSQL são gravados e poderia ser feita seleção e publicação de parte deste material.
- Produzir novos vídeos voltados para a internet. Podem ser pequenos, podem ser focados em temas específicos, indo do básico ao avançado. É a melhor forma de aprender a fazer mais e melhor.

Quem se habilita?

Este é um problema realmente grave?


Acredito que não, mas que é um ponto que pode ser melhor trabalhado pela comunidade do PostgreSQL.