-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplpgsql.sql
More file actions
75 lines (57 loc) · 1.7 KB
/
plpgsql.sql
File metadata and controls
75 lines (57 loc) · 1.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
-- View com informações de reservas, cliente e hospedagem
CREATE VIEW vw_reservas_completas AS
SELECT
r.reserva_id,
c.nome AS cliente,
h.tipo AS tipo_hospedagem,
e.rua || ', ' || e.numero || ' - ' || e.cidade AS endereco,
r.data_inicio,
r.data_fim,
r.preco_total
FROM tb_reservas r
JOIN tb_clientes c ON r.cliente_id = c.cliente_id
JOIN tb_hospedagens h ON r.hospedagem_id = h.hospedagem_id
JOIN tb_enderecos e ON h.endereco_id = e.endereco_id;
SELECT * FROM vw_reservas_completas;
SELECT * FROM vw_reservas_completas WHERE preco_total > 1650;
-- Função para calcular dias de estadia
CREATE OR REPLACE FUNCTION calcular_dias_estadia(reserva_id_value INT)
RETURNS INT AS $$
DECLARE dias INT;
BEGIN
SELECT (r.data_fim - r.data_inicio) INTO dias
FROM tb_reservas r
WHERE r.reserva_id = reserva_id_value;
RETURN dias;
END;
$$ LANGUAGE plpgsql;
SELECT calcular_dias_estadia(4);
SELECT calcular_dias_estadia(3);
-- Atualiza automaticamente quantidade de hospedagens com base nos cadastros
CREATE OR REPLACE PROCEDURE atualizar_qtd_hospedagens()
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE tb_proprietarios p
SET qtd_hospedagens = (
SELECT COUNT(*)
FROM tb_hospedagens h
WHERE h.proprietario_id = p.proprietario_id
);
END;
$$;
CALL atualizar_qtd_hospedagens();
-- Trigger para log de data de atualização
ALTER TABLE tb_hospedagens
ADD COLUMN atualizado_em TIMESTAMP;
CREATE OR REPLACE FUNCTION trg_atualiza_timestamp()
RETURNS TRIGGER AS $$
BEGIN
NEW.atualizado_em = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_atualiza_timestamp
BEFORE UPDATE ON tb_hospedagens
FOR EACH ROW
EXECUTE FUNCTION trg_atualiza_timestamp();