Você está na página 1de 3

Trabalho de Banco de Dados

Cdigo das tabelas da funo:


CREATE TABLE tb_produto(
id serial not null,
nome varchar(40) not null,
descricao varchar(100),
id_fabricante int not null,
valor float,
estoque int NOT NULL,
primary key (id),
foreign key (id_fabricante) references tb_fabricante(id)
);

CREATE TABLE tb_fabricante(


id serial not null,
nome varchar(40) not null,
primary key (id)
);
Funo
Descrio da funo:
Essa funo tem o objetivo de deletar todos os registros da tabela tb_produto
que possurem nomes repetidos de uma s vez e deixar apenas um dos
mesmos, e retornar a quantidade de registros deletados.

Cdigo da funo:
create or replace function deletaRepetido()
returns integer as
$$
declare
/*Todas as variaveis criadas aki*/
Vnavega record;
Vfabri int;
Vnome char(40);
Vid integer;
Vcont integer;
Vmaxfabri integer;
Vmaxdel integer := 0;
Vc integer;
begin
Vfabri := 1;
/*variavel Vmaxfabri recebe a quantidade de fabricantes existentes na tabela
"tb_fabricante"*/
Vmaxfabri := (select max(id) from tb_fabricante);
/*o lao de repetio vai do 0 at o valor da variavel Vxfabri*/
while Vfabri <= Vmaxfabri loop
/*sera armazenado na variavel Vnavega do tipo record, uma coluna com
todos os nomes sem repetioes*/
for Vnavega in (select distinct nome from tb_produto where id_fabricante
= Vfabri order by 1) loop
/*serao contados todos os nomes repetidos da tabela
"tb_produto", onde forem iguais a
Vnavega.nome(coluna "nome" de Vnavega contendo todos os
nomes sem repeties),
a variavel "Vnome" recebe o nome selecionado,variavel "Vcont"
recebe a quntidade de nomes iguis ao nome selecionado*/
select nome,count(nome) into Vnome,Vcont from tb_produto
where nome = Vnavega.nome group by nome;
/*imprimira no console o valor da variavel Vcont correspondente
ao nome selecionado*/
raise notice 'Value: %', Vcont;
/*Se o nome selecionado tiver repetioes entra no if*/
if Vcont > 1 then
Vc := 1;
/*lao que vai de 0 ao numero total de repeties do nome
selecionado*/
while Vc < (select count(nome) from tb_produto where
nome = Vnome) loop
/*variavel "Vid" recebe o valor do maior id do nome
repetido*/
Vid = (select id from tb_produto where nome =
Vnome order by 1 desc limit 1);
/*o nome removido com o axilio da comparao do
id da tabela com a variavel "Vid"*/
delete from tb_produto where Vid = id;
Vmaxdel := Vmaxdel + 1;
end loop;
end if;
end loop;
/*a variavel Vfabri soma mais 1 para pular para o proximo fabricante*/
Vfabri := Vfabri + 1;
end loop;
/* retornado a quantidade de nomes repetidos deletados*/
return Vmaxdel;
end;
$$ language 'plpgsql';

Cdigo para executar funo:


select deletaRepetido();

Você também pode gostar