Estudo de Caso I – Parte 1

Para você, que é iniciante e precisa de ajuda para instalar o postgres e preparar o ambiente clique aqui.
Siga o passa-a-passo corretamente, não altere os nomes aqui definidos, pois, futuramente serão usados para outros exemplos, ou estudos de caso. Se você alterá-los esteja ciente disto.

Iniciaremos nosso estudo de caso, criando nosso database e inserindo registros em nossas tabelas.

Criando o database

A criação do database é a parte mais simples, mas primeiramente criaremos um usuário para ser dono de nosso banco de dados. Vamos dar o nome ao nosso banco de vale e criaremos o usuário usuario.

CREATE USER usuario WITH PASSWORD ‘123456’;
CREATE DATABASE vale OWNER usuario;
Criando as tabelas

Conforme o estudo de caso vá prosseguindo O MER – Modelo Entidade Relacionamento – que será usado em nossos testes será sempre atualizado, uma ferramenta que aconselho é o PGModeler, com ele visualizamos, exportamos e importamos a estrutura do nosso modelo.

Vamos criar nossa primeira tabela, de início vamos usar somente alguns campos, e no decorrer do estudo de caso, vamos adicionando novos campos. Criaremos a tabela pessoas.

CREATE TABLE pessoas(
id serial NOT NULL,
nome varchar(200) NOT NULL,
sexo char NOT NULL,
dt_nasc date NOT NULL,
CONSTRAINT pk_pessoas_id PRIMARY KEY (id)
);
Inserindo os registros

Antes, vamos criar uma função que aleatoriamente definirá qual o sexo do nosso registro. Daremos o nome de qual_sexo para nossa função, está função simples, simplesmente retorna um valor aleatório de 1 ou 0. No nosso caso, utilizaremos o comando CASE que definirá M ou F para o sexo, ao inserir nosso registro.

Essa função foi feita em PL/SQL. O postgres permite que se seja adicionado outras linguagens como: Perl, Python, C.
CREATE OR REPLACE FUNCTION qual_sexo()
RETURNS character AS $BODY$
BEGIN
RETURN (SELECT CASE (SELECT (random()*1)::int) WHEN 0 THEN ‘M’ ELSE ‘F’ END);
END
$BODY$ LANGUAGE ‘plpgsql’;

Fazendo uma consulta chamando a função.

SELECT qual_sexo();

A função cria_nome é uma função que gera nomes aleatorios. Na linha do FOR nosso laço vai de 1 á RANDOM, onde o valor inicia entre 10 e 30, ou seja, nosso laço cria nomes com tamanhos entre 10 e 30 caracteres.

Na linha abaixo do comando FOR, temos um RANDOM, que vai de 0 a 25, depois é somando com 65, sabendo que o A na tabela ASCII começa com 65, podemos converter nosso número em caracter válido do nosso alfabeto, apenas usando a função CHR.

CREATE OR REPLACE FUNCTION cria_nome()
RETURNS character varying AS $BODY$
DECLARE
nome varchar;
BEGIN
nome = ”;
FOR i IN 1..(SELECT ((random()*20)::int)+10) LOOP
nome = nome || (SELECT chr(((random()*25)::int)+65));
END LOOP;
RETURN nome;
END
$BODY$ LANGUAGE ‘plpgsql’;

E por último, a função que irá criar a data de nascimento de forma aleatória, daremos o nome de cria_data_nasc.

Utilizamos a função random para criar o números aleatórios, fazemos no primeiro, a multiplicação por 27, pois, o resultado pode ser de 0 a 27, então somamos mais 1, para que se o resultado nunca seja 0. O segundo random é claramente o mês, visto que temos até 12 o limite. Já no terceiro é último random, temos a função extract(), que pega o ano corrente e diminui do random que é de 12 a 80, limitando a idade mínima para 12 e máxima para 80.

CREATE OR REPLACE FUNCTION cria_data_nasc()
RETURNS date AS $BODY$
BEGIN
RETURN ((SELECT ((random()*27+1)::int)::text || ‘/’ ||
((random()*11+1)::int)::text || ‘/’ ||
(extract(YEAR from now())-((random()*80+12)::int))::text))::date;
END
$BODY$ LANGUAGE ‘plpgsql’;

Agora por último, vamos criar a função que fará a inserção de dados na nossa tabela.

CREATE OR REPLACE FUNCTION ins_dados_pessoas(qtde integer)
RETURNS void AS $BODY$
BEGIN
FOR i IN 1..$1 LOOP
INSERT INTO pessoas(nome, sexo, dt_nasc)VALUES(cria_nome(), qual_sexo(), cria_data_nasc());
END LOOP;
END
$BODY$ LANGUAGE ‘plpgsql’;

Feito isso, já podemos inserir a quantidade que quisermos na nossa tabela pessoas. Execute o comando abaixo e coloque a quantidade que desejar.

Lembre-se que quanto maior a quantidade, mais tempo será necessário para a inserções.
SELECT ins_dados_pessoas(1000);
Erros que podem acontecer
Caso copie os comandos acima, usando o CTRL+C e CTRL+V, tome cuidado, pois copiar e colar o código pode fazer com que as aspas simples, vire acento, de forma a fazer o comando não funcionar. Então, observe se as aspas estão certas.

Outro erro que pode acontece, é durante a chamada da função ins_dados_pessoas(), pode acontecer um erro de datestyle. Conforme mostrado abaixo.

ERROR: date/time field value out of range: “22/4/1933”
HINT: Perhaps you need a different “datestyle” setting.
CONTEXT: SQL statement “SELECT ((SELECT ((random()*27+1)::int)::text || ‘/’ ||
((random()*11+1)::int)::text || ‘/’ ||
(extract(YEAR from now())-((random()*80+12)::int))::text))::date”
PL/pgSQL function “cria_data_nasc” line 3 at RETURN
SQL statement “INSERT INTO pessoas(nome, sexo, dt_nasc)VALUES(cria_nome(), qual_sexo(), cria_data_nasc())”
PL/pgSQL function “ins_dados_pessoas” line 4 at SQL statement
Solucionando o problema do DATESTYLE

Em algumas instalações o formato da data pode ser diferente, por este motivo é necessário, em algumas máquinas, configurar o DATESTYLE. O estilo que precisamos é ‘ISO, DMY’. Para verificar qual estilo faça o comando:

SHOW DATESTYLE;
DateStyle
———–
ISO, MDY
(1 row)

Devemos mudar para DMY, para isso basta setar o DateStyle.

SET DATESTYLE = ‘ISO, DMY’;
SHOW DATESTYLE;
DateStyle
———–
ISO, DMY
(1 row)

Continuaremos nosso estudo de caso no próximo post.