<p><img src="https://i.imgur.com/D01Fpky.png" alt="" title="Entre no nosso site e veja nossos cursos"></p> <h1> <img class="emoji" alt="" src="https://image.flaticon.com/icons/png/128/2906/2906274.png"> BD Essencial - Aula 6 </h1> <p>O objetivo desse curso &eacute; capacitar o aluno a entrar no mercado de trabalho executando as atividades primordiais que s&atilde;o solicitadas no desenvolvimento, manuten&ccedil;&atilde;o, ou atualiza&ccedil;&atilde;o de bancos de dados dos mais diferentes tipos de sistemas.</p> <p>Focamos na execu&ccedil;&atilde;o, e n&atilde;o em cria&ccedil;&atilde;o de diagramas - atividade essa que &eacute; desenvolvida por profissionais mais experientes.</p> <p>Nas nossas prieiras aulas, utilizamos o Gerenciador de Bancos de Dados Relacionais <strong>MySQL</strong> nesse nosso curso de Banco de Dados Essencial, porque essa ferramenta &eacute; gratuita e de f&aacute;cil utiliza&ccedil;&atilde;o - entretanto, todo o nosso conte&uacute;do pode ser aplicado em qualquer Gerenciador de Bancos de Dados Relacionais, apenas com algumas m&iacute;nimas diferen&ccedil;as.</p> <p>Na segunda parte do curso, utilizamos o Gerenciador de Bancos de Dados Relacionais <strong>PostgreSQL</strong>.</p> <blockquote style="border-left-color: red;"> <p><span class="color" data-color="red"></span><span> </span><small><i class="fa fa-user"></i> Prof Fernando Gomes - fernandojnr@gmail.com</small></p></blockquote> <h2 id="-Tema-da-aula" data-id="-Tema-da-aula"><a class="anchor hidden-xs" href="#-Tema-da-aula" title="-Tema-da-aula"><span class="octicon octicon-link"></span></a><img class="emoji" alt=":book:" src="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/images/basic/book.png"> <span> Tema da aula:</span></h2><span> <p>Nessa sexta aula, vamos falar sobre</p> <ul> <li>Números com casas decimais;</li> <li>Função com passagem de valor por parâmetro;</li> <li>DROP FUNCTION IF EXISTS;</li> <li>Conversão de número em string, usando <strong>to_char</strong>;</li> <li>plpgsql;</li> <li>Operador ||;</li> <li>Exceção;</li> <li>Trigger;</li> <li>before insert;</li> <li>Cópia de dados de tabela para TXT e CSV [com ou sem cabeçalhos] com <strong>\copy</strong>;</li> <li>create table like;</li> <li>Importação de dados de arquivo TXT para tabela;</li> <li>Comando alter table para criação de chave primária;</li> <li>Exportando dados de tabela para arquivo JSON com <strong>row_to_json<strong>;</li> </ul> <p>&nbsp;</p> ```postgre= \c banco20; -- salario: numero de dez digitos -- sendo 2 desses para as casas decimais create table funcionario( idFuncionario serial primary key, nome varchar (50) not null, sexo varchar (1) check (sexo in('m','f')) not null, salario dec(10,2) not null); insert into funcionario (nome, sexo, salario) values ('david','m',8000), ('matheus','m',5000), ('marcelo','m',7600), ('sergio', 'm',5000), ('luciana','f',1200); -- insert into funcionario (nome, sexo, salario) values -- ('belem','m',12345678.91); select * from funcionario; -- funcao com passagem de valor por parametro create or replace function fnObterNome(id INT) returns varchar (50) as $$ select nome from funcionario where idFuncionario = id; $$ language sql; select fnObterNome(1); select fnObterNome(2); select fnObterNome(3); -- DROP FUNCTION IF EXISTS fnObterNome(id INT); select to_char(1000000, '"R$"999G999G999D99'); banco20=# select to_char(1000000, '"R$"999G999G999D99'); to_char ------------------- R$ 1.000.000,00 (1 row) -- funcao com passagem de valor por parametro -- sem ter um nome declarado para esse parametro -- retorna um numero com casas decimais -- dez digitos no total, dos quais, dois sao para as casas decimais create or replace function fnCalculoDescontoNum(dec(10,2)) returns dec(10,2) as $$ select $1 * 0.95; $$ language sql; -- resultado nao sai com formatacao perfeita select nome, sexo, fnCalculoDescontoNum(salario) as desconto from funcionario; -- retornando o valor formatado como uma string -- dessa forma, controlamos a formatacao do resultado create or replace function fnCalculoDesconto(Dec(10,2)) returns varchar (15) as $$ select to_char($1 * 0.95, '"R$"999G999G999D99'); $$ language sql; select nome, sexo, fnCalculoDesconto(salario) as desconto from funcionario; -- funcao em plpgsql -- recebe os dados do funcionario; -- calcula o sal. liquido; -- insere na tabela depois de feito o calculo; -- retorna uma mensagem se o cadastro foi feito com sucesso; create or replace function cadFunc(varchar(30), char, dec(10,2)) returns varchar(50) as $$ declare -- variaveis internas da function msg varchar(50); liquido dec(10,2); begin if $3 > 4000 then liquido = $3 * 0.8; else liquido = $3 * 0.9; end if; insert into funcionario(nome, sexo, salario) values ($1, $2,liquido); msg = $1 || ' Cadastrado com Sucesso !!!!'; -- Operador || permite a cooncatenacao de varias strings return msg; end; $$ language plpgsql; select cadFunc('Du dudu Edu','m',1000); select cadFunc('Lucina Medeiro','m',15000); select * from funcionario; -- funcao que eh chamada por um trigger: "retorna" um trigger; -- lanca uma excecao, caso a regra de negocio nao seja atendida -- so insere na tabela se o salario for maior q 900 create or replace function fnVerificaSalarioMin() returns trigger as $$ begin if new.salario < 900 then raise Exception 'Salario Inferior que o Salario Minimo !!!'; end if; end; $$ language PLPGSQL; create trigger triggerVerificaSalarioMinimo before insert on funcionario for each row execute procedure fnVerificaSalarioMin(); insert into funcionario (nome,sexo,salario) values ('ze estagiario','m','800'); banco20=# insert into funcionario (nome,sexo,salario) values banco20-# ('ze estagiario','m','800'); ERROR: Salario Inferior que o Salario Minimo !!! create sequence seq_veiculo start with 102 increment by 1; create table veiculo( idVeiculo int primary key, modelo varchar (50) not null, ano int not null, valor dec(10,2) not null ); insert into veiculo values (nextval('seq_veiculo'), 'Eco Sport',2012, 25000); insert into veiculo values (nextval('seq_veiculo'), 'palio',2015, 33000); insert into veiculo values (nextval('seq_veiculo'), 'hb20',2015, 45000); -- copiando o conteudo de uma tabela para um arquixo TXT \copy veiculo to 'C:\BD\veiculo.txt' 102 Eco Sport 2012 25000.00 103 palio 2015 33000.00 104 hb20 2015 45000.00 -- copiando o conteudo de uma tabela para um arquixo CSV \copy veiculo to 'C:\BD\veiculo.csv' delimiter ',' -- abrimos com o excel e visualizamos uma planilha normal \copy veiculo to 'C:\BD\veiculo2.csv' delimiter ',' header csv -- abrimos com o excel e visualizamos uma planilha normal -- dessa vez, com cabecalhos idveiculo modelo ano valor 102 Eco Sport 2012 25000 103 palio 2015 33000 104 hb20 2015 45000 --criando tabela igual a tabela veiculo create table importVeiculo(like veiculo); banco20=# \d importVeiculo Table "public.importveiculo" Column | Type | Modifiers -----------+-----------------------+----------- idveiculo | integer | not null modelo | character varying(50) | not null ano | integer | not null valor | numeric(10,2) | not null banco20=# \d veiculo Table "public.veiculo" Column | Type | Modifiers -----------+-----------------------+----------- idveiculo | integer | not null modelo | character varying(50) | not null ano | integer | not null valor | numeric(10,2) | not null Indexes: "veiculo_pkey" PRIMARY KEY, btree (idveiculo) --importando os dados do arquivo TXT \copy importVeiculo from 'C:\BD\veiculo.txt' banco20=# select * from importVeiculo; idveiculo | modelo | ano | valor -----------+-----------+------+---------- 102 | Eco Sport | 2012 | 25000.00 103 | palio | 2015 | 33000.00 104 | hb20 | 2015 | 45000.00 (3 rows) -- alterando tabela para idVeiculo se tornar chave primaria ALTER TABLE importVeiculo ADD PRIMARY KEY (idveiculo); banco20=# \d importveiculo Table "public.importveiculo" Column | Type | Modifiers -----------+-----------------------+----------- idveiculo | integer | not null modelo | character varying(50) | not null ano | integer | not null valor | numeric(10,2) | not null Indexes: "importveiculo_pkey" PRIMARY KEY, btree (idveiculo) select row_to_json(veiculo) from veiculo; banco20=# select row_to_json(veiculo) from veiculo; row_to_json -------------------------------------------------------------------- {"idveiculo":102,"modelo":"Eco Sport","ano":2012,"valor":25000.00} {"idveiculo":103,"modelo":"palio","ano":2015,"valor":33000.00} {"idveiculo":104,"modelo":"hb20","ano":2015,"valor":45000.00} (3 rows) \copy (select row_to_json(veiculo) from veiculo) to 'C:\BD\veiculo.json' ``` <!-- <h3> Tipos de Dados Numéricos do MySQL </h3> <p> Na tabela abaixo vemos os tipos da dados numéricos aceitos no MySQL. Utilizamos, BIT ou TINYINT(1) para armazenar um campo booleano. Além dessa situação, os mais utilizados são TINYINT, INT, e DOUBLE. Por padrão, os campos admitem números com sinal, portanto, o padrão [default] é SIGNED. </p> ![](https://i.imgur.com/ctbQVW0.png) --> <blockquote style="border-left-color: red;"> <p><span class="color" data-color="red"></span><span> </span><small><i class="fa fa-user"></i> Prof Fernando Gomes - fernandojnr@gmail.com</small></p></blockquote> <br> <div class="alert alert-info"> <blockquote style="border-left-color: blue;"> <p><span class="color" data-color="blue"></span><span> </span><small><i class="fa fa-user"></i> E.B. Cursos https://www.cursoseb.com.br/</small><br> <span class="color" data-color="blue"></span><span> </span><small><i class="fa fa-user"></i> E.B. Cursos EAD https://edsonbelemtreinamento.com.br/ead/</small></p> </blockquote> </div>