---
# System prepended metadata

title: "\n BD Essencial - Aula 6\n"

---

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




