RECUPERAÇÃO DE CONTEÚDO BANCO DE DADOS No Instituto Federal do Paraná tounou-se necessário o armazenamento de certas informações para controle de pessoal. Para armazenar tais dados é necessário saber que: uma pessoa possuiu um privilégio (gerente, supervisou ou usuário) e trabalha em um ou mais projetos, esses por sua vez pertencem a apenas um departamento (pessoa, financeiro, jurídico). Existem na instituição privilégios e departamentos sem nenhum relacionamento e projetos relacionados a muitas pessoas. Modelo Conceitual Modelo Entidade Relacionamento
Inserts insert into Privilegio(descricao) values ("gerente"); insert into Privilegio(descricao) values ("supervisor"); insert into Privilegio(descricao) values ("usuário"); insert into Departamento(descricao) values ("pessoal") insert into Departamento(descricao) values ("financeiro") insert into Departamento(descricao) values ("juridico") insert into Pessoa(nome,cod_privilegio) values ("João",1); insert into Pessoa(nome,cod_privilegio) values ("Maria",2); insert into Pessoa(nome,cod_privilegio) values ("José",3); data_termino,data_termino_previsto) values ("Projeto1",1,500.00,"2014-01- 01","2014-12-12","2014-12-12"); data_termino_previsto) values ("Projeto2",2,600.00,"2014-01-01","2014-12-12"); data_termino_previsto) values ("Projeto3",3,700.00,"2014-01-01","2014-12-12"); data_termino_previsto) values ("Projeto4",2,600.00,"2013-01-01","2013-12-12"); insert into Trabalha(cod_pessoa,cod_projeto) values (1,1); insert into Trabalha(cod_pessoa,cod_projeto) values (2,2); insert into Trabalha(cod_pessoa,cod_projeto) values (3,3); Selects Selecionar as pessoas que estão relacionadas ao projeto 1 select p.nome from Pessoa p, Trabalha t where p.cod_pessoa=t.cod_pessoa and t.cod_projeto=1; Selecionar todos os projetos inacabados select p.nome from Projetos p where p.data_termino is null; Selecionar as pessoas que trabalham em projetos do departamento jurídico select p.nome from Pessoa p, Trabalha t, Departamento d, Projetos pr where p.cod_pessoa=t.cod_pessoa and t.cod_projeto=pr.cod_projetos and pr.cod_departamento=d.cod_departamento and d.descricao="juridico"; Contar o numero de gerentes que trabalham no departamento pessoal. SELECT COUNT(p.cod_pessoa) from Pessoa p, Projetos pr, Privilegio pri, Departamento d, Trabalha t where pri.descricao="gerente" and p.cod_privilegio=pri.cod_privilegio and p.cod_pessoa=t.cod_pessoa and t.cod_projeto=pr.cod_projetos and pr.cod_departamento=d.cod_departamento and d.descricao="pessoal"; Update UPDATE pessoa SET nome ='João Felipe' WHERE cod_pessoa=1;
Store Procedure drop procedure if exists SP_atraso$$ create procedure SP_atraso() Begin select p.nome, d.descricao from Projetos p, Departamento d WHERE p.data_termino is null and p.cod_departamento=d.cod_departamento and CURDATE()>p.data_termino_previsto group by d.descricao; end $$ call SP_atraso(); Event Schedule drop event Evento_custo; create event Evento_custo on schedule every 1 month STARTS CURRENT_DATE on completion preserve enable do begin update Projetos set custo=custo*1.1 where cod_projetos>0 and data_termino is null; end$$ Trigger drop trigger if exists controle_projetos$$ create trigger controle_projetos before insert on Trabalha for each row begin declare contador int; SELECT COUNT(t.cod_projeto) into contador FROM Pessoa p, Projetos pj, Trabalha t WHERE p.cod_pessoa=t.cod_pessoa AND pj.cod_projetos=t.cod_projeto AND p.cod_pessoa=new.cod_pessoa AND pj.data_termino is null; if (contador > 3) then SELECT 0 FROM `Pessoa cadastrada em mais de 3 projetos ativos` INTO @error; end if; end$$
Function CREATE FUNCTION media() RETURNS FLOAT DETERMINISTIC BEGIN DECLARE qtdd,a INT; DECLARE media,soma FLOAT; SELECT COUNT(cod_projetos) into qtdd from Projetos where 1; set a=1; set media=0; while(a<=qtdd) do SELECT custo into soma FROM Projetos WHERE cod_projetos=a; set media=media+soma; set a= a+1; end while; SET media = media/qtdd; RETURN media; END $$ delimiter; Cursor drop procedure if exists SP_pessoas$$ create procedure SP_pessoas(OUT soma_total INT) Begin declare contador int default 0; declare pessoa int default 0; declare soma int default 0; declare meucursor cursor for select cod_pessoa from Trabalha; declare continue handler for not found set contador=1; open meucursor; meuloop: LOOP fetch meucursor into pessoa; if contador = 1 then leave meuloop; end if; set soma=soma+pessoa; end loop meuloop; set soma_total=soma; end $$ call SP_pessoas(@variavel_temporaria); select @variavel_temporaria;
Transação Após conectar com o mysql através do terminal, e selecionar a database que se vai utilizar (comando use nome_database ), pode-se mexer com as tabelas da mesma. O exemplo a seguir mostra que em ambos os terminais a tabela Tb_alunos possui os mesmos dados. Agora com o comando start transaction a transação foi iniciada no 1 terminal, imediatamente um novo registro foi inserido na tabela Tb_alunos do mesmo. Mostrando novamente os registros da tabela nos dois terminais, vemos que o 6 registro só aparece no primeiro terminal, pois esse está no meio de uma transação. Através do comando commit a transação foi efetuada, e o 6 registro está realmente cadastrado no banco, e aparece na tabela nos dois terminais.
Com esses mesmos terminais, iniciamos novamente uma transação no 1 terminal, e como executado antes, um novo registro foi inserido no terminal com transação aberta. Agora através do comando rollback, pudemos desfazer o registro e esse não foi efetuado no banco de dados.