9
Trabalho 2 Nome= Ricardo Duranti Usando a ferramenta IBExpert e o banco de dados LOCADORA.FDB, desenvolva a tarefas listadas a seguir: *Colar os SQLs criados e testados após cada questão. 1. (1,00) Crie os generators para fornecer valores incrementais para as chaves primárias das tabelas: CLIENTES FILMES LOCACOES LOCACOES_ITENS PAGAMENTOS DEVOLUCOES CREATE SEQUENCE GEN_CLIENTES; ALTER SEQUENCE GEN_CLIENTES RESTART WITH 0; CREATE SEQUENCE GEN_FILMES; ALTER SEQUENCE GEN_FILMES RESTART WITH 0; CREATE SEQUENCE GEN_LOCACOES; ALTER SEQUENCE GEN_LOCACOES RESTART WITH 0; CREATE SEQUENCE GEN_LOCACOES_ITENS; ALTER SEQUENCE GEN_LOCACOES_ITENS RESTART WITH 0; CREATE SEQUENCE GEN_PAGAMENTOS; ALTER SEQUENCE GEN_PAGAMENTOS RESTART WITH 0; CREATE SEQUENCE GEN_DEVOLUCOES; ALTER SEQUENCE GEN_DEVOLUCOES RESTART WITH 0; Profª. Cheila Bombana – Banco de Dados II.

Trabalho BD II

Embed Size (px)

DESCRIPTION

Trabalho sobre procedures e triggers no firebird

Citation preview

Page 1: Trabalho BD II

Trabalho 2

Nome= Ricardo Duranti

Usando a ferramenta IBExpert e o banco de dados LOCADORA.FDB, desenvolva a tarefas listadas a seguir:

*Colar os SQLs criados e testados após cada questão.

1. (1,00) Crie os generators para fornecer valores incrementais para as chaves primárias das tabelas:

CLIENTESFILMESLOCACOESLOCACOES_ITENSPAGAMENTOSDEVOLUCOES

CREATE SEQUENCE GEN_CLIENTES;ALTER SEQUENCE GEN_CLIENTES RESTART WITH 0;

CREATE SEQUENCE GEN_FILMES;ALTER SEQUENCE GEN_FILMES RESTART WITH 0;

CREATE SEQUENCE GEN_LOCACOES;ALTER SEQUENCE GEN_LOCACOES RESTART WITH 0;

CREATE SEQUENCE GEN_LOCACOES_ITENS;ALTER SEQUENCE GEN_LOCACOES_ITENS RESTART WITH 0;

CREATE SEQUENCE GEN_PAGAMENTOS;ALTER SEQUENCE GEN_PAGAMENTOS RESTART WITH 0;

CREATE SEQUENCE GEN_DEVOLUCOES;ALTER SEQUENCE GEN_DEVOLUCOES RESTART WITH 0;

2. (1,00) Crie uma trigger para cada tabela, que tenha a função de simular o auto-incremento, atribuindo valores para as chaves primárias somente se estas estiverem nulas:

ASbegin if(new.codigo is null)then new.codigo = gen_id(gen_clientes,1);

endProfª. Cheila Bombana – Banco de Dados II.

Page 2: Trabalho BD II

ASbegin if(new.codigo is null)then new.codigo = gen_id(gen_devolucoes,1);

end

ASbegin if(new.codigo is null)then new.codigo = gen_id(gen_filmes,1);

end

ASbegin if(new.codigo is null)then new.codigo = gen_id(gen_locacoes,1);end

ASbegin if(new.codigo is null)then new.codigo = gen_id(gen_locacoes_itens,1);end

ASbegin if(new.codigo is null)then new.codigo = gen_id(gen_pagamentos,1);end

3. (1,00) Use as triggers também para inicializar campos como datas e valores caso estejam nulos:

LOCACOES - Data = ‘NOW’, Valor, Pago = NLOCACOES_ITENS - Quantidade = 0, Valor Unitario = 0, Valor Total = Quantidade * Valor UnitarioPAGAMENTOS – Data = ‘NOW’, Valor = 0DEVOLUCOES – Data = ‘NOW’, Quantidade = 0

LOCAÇOES:

Asbeginif(new.data is null)then new.data = 'NOW';

Profª. Cheila Bombana – Banco de Dados II.

Page 3: Trabalho BD II

if(new.valor is null)then new.valor = 0;

if(new.pago is null)then new.pago = 'N';

end

LOCACOES_ITENS:

Asbeginif(new.quantidade is null)then new.quantidade = 0;

if(new.valorunitario is null)then new.valorunitario = 0;

new.valortotal = new.quantidade * new.valorunitario;

end

PAGAMENTOS:Asbeginif(new.data is null)then new.data = 'NOW';

if(new.valor is null)then new.valor = 0;end

DEVOLUCOES:AsBegin

if(new.data is null)then new.data = 'NOW';

if( new.quantidade is null)then new.quantidade = 0;

end

4. (1,00) Crie triggers na tabela LOCACOES_ITENS que atualizem o campo VALOR na tabela LOCACOES após cada inserção, alteração ou exclusão de registro.

After insert

Profª. Cheila Bombana – Banco de Dados II.

Page 4: Trabalho BD II

ASbegin update locacoes set locacoes.valor = locacoes.valor + new.valortotal where locacoes.codigo = new.cdlocacao;end

After update

ASbegin update locacoesset locacoes.valor = locacoes.valor - old.valortotal + new.valortotal where locacoes.codigo = new.cdlocacao;

end

After Delete

ASbegin update locacoes set locacoes.valor = locacoes.valor - old.valortotal where locacoes.codigo = old.cdlocacao;end

5. (1,50) Crie triggers na tabela LOCACOES_ITENS que atualizem o campo QUANTIDADE_DISPONIVEL na tabela FILMES após cada inserção, alteração ou exclusão de registro.

After insert

ASbegin

update filmes set filmes.quantidade_disponivel = filmes.quantidade_disponivel + new.quantidade where filmes.codigo = new.cdfilme;end

After updateAs Begin

update filmes set filmes.quantidade_disponivel = filmes.quantidade_disponivel - old.quantidade + new.quantidade where filmes.codigo = new.cdfilme;

Profª. Cheila Bombana – Banco de Dados II.

Page 5: Trabalho BD II

end

After Delete

As begin

update filmes set filmes.quantidade_disponivel = filmes.quantidade_disponivel - old.quantidade where filmes.codigo = old.cdfilme;

end

6. (1,50) Crie triggers na tabela DEVOLUCOES que atualizem o campo QUANTIDADE_DISPONIVEL na tabela FILMES após cada inserção, alteração ou exclusão de registro.

After Insert

ASbegin update filmes set filmes.quantidade_disponivel = filmes.quantidade_disponivel + new.quantidade where filmes.codigo = new.cdfilme;

end

After update

ASbegin update filmes set filmes.quantidade_disponivel = filmes.quantidade_disponivel - old.quantidade + new.quantidade

where filmes.codigo = new.cdfilme;

end

After delete

AS

Profª. Cheila Bombana – Banco de Dados II.

Page 6: Trabalho BD II

beginupdate filmesset filmes.quantidade_disponivel = filmes.quantidade_disponivel - old.quantidade

where filmes.codigo = old.cdfilme;end

7. (1,50) Crie ou altere trigger na tabela LOCACOES_ITENS que verifique se existe quantidade disponível de filme para locação antes de registrar o item da locação, mostrando mensagem caso não exista quantidade disponível. OBS: usar Exception, usar declare variable na triggerASdeclare variable quant integer;begin

select filmes.quantidade_disponivel from filmes where filmes.codigo = new.cdfilme into :quant ;

if(:quant < new.quantidade)then exception qtd_insuficiente;

if(new.codigo is null)then new.codigo = gen_id(gen_locacoes_itens,1);

if(new.quantidade is null)then new.quantidade = 0;

if(new.valorunitario is null)then new.valorunitario = 0;

new.valortotal = new.quantidade * new.valorunitario;end

8. (1,50) Crie uma procedure com o nome ANALISE_PAGAMENTOS, que deve ter como parâmetros de saída os seguintes campos: Código da LocaçãoData da LocaçãoNome do ClienteValor da LocaçãoCódigo do PagamentoData do PagamentoValor do Pagamento

Profª. Cheila Bombana – Banco de Dados II.

Page 7: Trabalho BD II

Valor Pendente (Valor da Locação - Valor do Pagamento)

begin

for select locacoes.codigo,clientes.nome,locacoes.valor, pagamentos.codigo, pagamentos.data, pagamentos.valor

from locacoes inner join clientes on (clientes.codigo = locacoes.cdcliente) inner join pagamentos on (locacoes.codigo = pagamentos.cdlocacao)

into :codigo_locacao, :nome_cliente, :valor_locacao, :codigo_pgto, :data_pgto, :valor_pgto

do begin

valor_pendente = :valor_locacao - :valor_pgto;

suspend; endend

Trabalho individual.

Enviar, para o e-mail [email protected] até o dia 02/12/2014, com o assunto Trabalho BD II, este arquivo preenchido e o banco de dados alterado.

Profª. Cheila Bombana – Banco de Dados II.