Você está na página 1de 5

Soluções exercícios - Unidade 1

1)
De modo geral a SQL Dinâmica permite que programas (utilizando uma linguagem de
alto nível) construam e submetam em tempo de execução instruções SQL (DDL e
DML). Analisando a especificação/implementação JDBC esta pode ser considerada
uma extensão da SQL Dinâmica, pois permite a incorporação de comandos SQL
através da utilização de uma API.

Para se criar uma vinculação entre a API JDBC e um SGBD qualquer se tornam
necessários os seguintes passos:
a. Obtenção do driver JDBC correspondente ao banco de dados que deseja
realizar a conexão;
b. Indicação clara do caminho onde esse driver se encontra de tal maneira que
o programa possa encontrá-lo (aqui a definição do CLASSPATH é
requerida);
c. Carga do driver JDBC de maneira dinâmica;
d. Estabelecimento da conexão com o banco de dados;
e. Após a obtenção de uma conexão pode-se realizar as operações de DDL e
DML através do conceito de Statement e PreparedStatement; Múltiplos
comandos podem ser executados enquanto a conexão com o banco de
dados estiver ativa;
f. No caso de execução do comando Select é possível obter o conjunto de
dados (relação) resultante, iterar sobre esse conjunto e coletar o conteúdo de
cada linha e coluna;
g. O último passo envolve a liberação do recurso, ou seja, o fechamento da
conexão com o banco de dados;

2 e 3)

CREATE TABLE EMPREGADO


(CODIGO INTEGER,
NOME VARCHAR(50),
SALARIO NUMERIC,
CATEGORIA INTEGER);

DELETE FROM EMPREGADO;


INSERT INTO EMPREGADO (CODIGO, NOME, SALARIO, CATEGORIA) VALUES (1,
'Empregado 1', 1500.00, 1);
INSERT INTO EMPREGADO (CODIGO, NOME, SALARIO, CATEGORIA) VALUES (2,
'Empregado 2', 2500.00, 2);
INSERT INTO EMPREGADO (CODIGO, NOME, SALARIO, CATEGORIA) VALUES (3,
'Empregado 3', 3200.00, 1);
INSERT INTO EMPREGADO (CODIGO, NOME, SALARIO, CATEGORIA) VALUES (4,
'Empregado 4', 900.00, 2);
INSERT INTO EMPREGADO (CODIGO, NOME, SALARIO, CATEGORIA) VALUES (5,
'Empregado 5', 1130.00, 3);

CREATE TABLE CATEGORIA


(CODIGO INTEGER,
PERCENTUAL NUMERIC);

INSERT INTO CATEGORIA VALUES (1, 9.2);


INSERT INTO CATEGORIA VALUES (2, 7.6);
INSERT INTO CATEGORIA VALUES (3, 2.3);

COMMIT;

CREATE OR REPLACE FUNCTION obtemPercentual(pcategoria INTEGER)


RETURNS NUMERIC AS $$
DECLARE
perc NUMERIC;
cp CURSOR FOR SELECT percentual FROM categoria WHERE codigo = pcategoria;
BEGIN
OPEN cp;
FETCH cp INTO perc;
CLOSE cp;
RETURN perc;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION AtualizaSalario () RETURNS integer AS $$


DECLARE

r RECORD;
perc NUMERIC;

BEGIN

FOR r IN SELECT codigo, salario, categoria FROM empregado LOOP


perc := obtemPercentual(r.categoria);
UPDATE empregado
SET salario = salario * (1 + (perc / 100))
WHERE codigo = r.codigo;
END LOOP;
RETURN 1;

EXCEPTION WHEN plpgsql_error THEN


RAISE NOTICE 'Erro ocorrido durante o processamento.';
rollback;
RETURN -1;

END;
$$ LANGUAGE plpgsql;
------------------------------
select AtualizaSalario();

select * from empregado;

4)

CREATE TABLE consulta_total


(cod_tipo INTEGER,
total NUMERIC(2,2);

CREATE TABLE consulta


(seq_consulta INTEGER,
cod_tipo INTEGER,
data timestamp
valor NUMERIC(2,2);

insert into consulta(seq_consulta, cod_tipo, data, valor) values (1, 1, '2018-08-06'


,100.00);
insert into consulta(seq_consulta, cod_tipo, data, valor) values (2, 1, '2018-08-06'
,150.00);
insert into consulta(seq_consulta, cod_tipo, data, valor) values (3, 2, '2018-08-06'
,50.00);

CREATE OR REPLACE FUNCTION prAtualizaTotalConsultas()


RETURNS TRIGGER AS $$
DECLARE
soma numeric;
t1 integer;
t2 integer;
c1 cursor for select sum(valor) from consulta where cod_tipo = t2;
BEGIN

IF (TG_OP = 'DELETE') THEN


select c.cod_tipo into t1 from consulta c where cod_tipo = old.cod_tipo;
if not found then
DELETE from consulta_total where cod_tipo = old.cod_tipo;
else
t2 = old.cod_tipo;
OPEN c1;
FETCH c1 INTO soma;
update consulta_total set total = soma where cod_tipo = old.cod_tipo;
end if;
return old;
CLOSE c1;
ELSE
--raise notice 'Value: %', NEW.cod_tipo;
t2 = new.cod_tipo;
OPEN c1;
FETCH c1 INTO soma;
select ct.cod_tipo into t1 from consulta_total ct where cod_tipo = NEW.cod_tipo;
if not found then
insert into consulta_total (cod_tipo, total) values (NEW.cod_tipo, soma);
else
update consulta_total set total = soma where cod_tipo = NEW.cod_tipo;
end if;
CLOSE c1;
return NEW;
END IF;

END;
$$ LANGUAGE plpgsql;

------------------------
CREATE TRIGGER atualizaConsulta
AFTER INSERT OR UPDATE OR DELETE ON consulta
FOR EACH ROW EXECUTE PROCEDURE prAtualizaTotalConsultas();
------------------------
insert into consulta(seq_consulta, cod_tipo, data, valor) values (1, 2, '2018-08-06'
,50.00);

update consulta set valor = 20.00 where cod_tipo = 1;

delete from consulta where cod_tipo = 2;

delete from consulta_total

select * from consulta_total


select * from consulta
5) PSMs referem-se a programas/rotinas de uso geral em SQL que são armazenadas
no SGBD. Também conhecidas como procedimentos armazenados (Stored
Procedures).

Vantagens
a. Se um programa de banco de dados é utilizado por várias aplicações, ele
pode ser armazenado no servidor e invocado por qualquer um dos
programas de aplicação;
b. A transferência de dados e o custo de comunicação entre o cliente e o
servidor pode ser reduzido;
c. Possibilitam um bom ferramental para modelar comportamentos mais
complexos no desenvolvimento de sistemas.
Desvantagens
d. Impactam no desenvolvimento de aplicações independentes de banco de
dados uma vez que esse tipo de abordagem utiliza linguagens
proprietárias;
e. Entretanto, muitos SGDBs possibilitam que procedimentos armazenados
sejam escritos em linguagem de programação de uso geral.

Você também pode gostar