Académique Documents
Professionnel Documents
Culture Documents
Banco de Dados 2
Exerccios Unidade 1
Documento apresentado como composio de nota de
prevista no plano da ensino da disciplina de Interface
Banco de Dados 2, no Curso de Tecnologias da
Informao e Comunicao, na Universidade Federal de
Santa Catarina.
Prof. Dr. Alexandre Leopoldo Gonsalves.
Ararangu, 2016
END AtualizaSalario;
FUNCTION CalculaAumento(salario IN NUMBER, percentual IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN salario * (1 + (percentual / 100));
END CalculaAumento;
END PSalario;
/
begin
PSalario.AtualizaSalario(12.5);
end; /
select salario, PSalario.CalculaAumento(salario, 11.2) from empregado;
update empregado
set salario = PSalario.CalculaAumento(salario, 11.2);
CREATE OR REPLACE TRIGGER ListaMudancaEmpregado
BEFORE DELETE OR INSERT OR UPDATE ON Empregado
FOR EACH ROW
WHEN (new.codigo > 0)
DECLARE
diferenca number;
BEGIN
diferenca := :new.salario - :old.salario;
dbms_output.put('Salrio antigo: ' || :old.salario);
dbms_output.put(' Novo salrio: ' || :new.salario);
dbms_output.put_line(' Diferena: ' || diferenca);
END;
/
CREATE TABLE DESPESA
(CODIGO NUMBER, -- 1 Refere-se a salrios
TOTAL NUMBER);
/
insert into despesa (codigo, total) values (1, 0.0);
DROP TRIGGER SumarizaSalario;
CREATE OR REPLACE TRIGGER SumarizaSalario
AFTER DELETE OR INSERT OR UPDATE ON Empregado
DECLARE
vtotal number;
cursor c1 is
select sum(salario) from empregado;
BEGIN
open c1;
fetch c1 into vtotal;
update despesa
set total = vtotal
where codigo = 1;
close c1;
END;
3) Altere a funo AtualizaSalario para que esta trate de maneira adequada a sada do comando de
iterao (LOOP) assim como eventuais erros (excees) de processamento na verso PostgreSQL.
CREATE OR REPLACE FUNCTION AtualizaSalario ( percentual NUMERIC ) RETURNS integer AS $$
DECLARE
codigoe INTEGER;
salarioe NUMERIC;
ctr INTEGER=0;
c1 CURSOR FOR SELECT codigo, salario FROM empregado;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO codigoe, salarioe;
ctr := ctr + 1;
EXIT WHEN ctr > 5;
salarioe := salarioe * (1 + (percentual / 100));
UPDATE empregado
SET salario = salarioe
WHERE codigo = codigoe;
END LOOP;
CLOSE c1;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
4) Considerando o esquema a seguir elabore um PSM (procedimento armazenado) em PL/SQL (Oracle)
ou PL/pgSQL (Postgre) que sumarize o total das consultas por tipo de convnio (tabela Tipo) persistindo
essas informaes na tabela consulta_total. O conceito de cursor deve ser utilizado. O procedimento
deve ainda receber a informao de qual tipo de convnio deve ser processado.
CREATE OR REPLACE PROCEDURE prAtualizaTotalConsultas(tipop integer) IS
soma numeric;
cursor c1 is
select sum(valor) from consulta where cod_tipo = tipop;
BEGIN
open c1;
fetch c1 into soma;
close c1;
insert into consulta_total (cod_tipo, total) values (tipop, soma);
commit;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
update consulta_total