-
Notifications
You must be signed in to change notification settings - Fork 923
/
Copy pathcria_transacao.sql
46 lines (42 loc) · 1.46 KB
/
cria_transacao.sql
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
CREATE OR REPLACE FUNCTION realizar_transacao(
p_id int,
p_valor int,
p_tipo char,
p_descricao text,
p_realizadaEm timestamp
) RETURNS RECORD AS $$
DECLARE
limite int;
saldo int;
novo_saldo int;
novo_limite int;
resultado RECORD;
BEGIN
-- Travar a tabela "Clientes" em modo exclusivo de linha
LOCK TABLE "Clientes" IN ROW EXCLUSIVE MODE;
-- Selecionar e travar a linha específica para atualização
SELECT "Limite", "Saldo" INTO limite, saldo
FROM "Clientes" c
WHERE "Id" = p_id
FOR UPDATE;
IF NOT FOUND THEN
RAISE EXCEPTION 'cliente nao encontrado';
END IF;
-- Atualizar o saldo com base no tipo
IF (p_tipo = 'd') THEN
IF ((-p_valor + saldo) < -limite) THEN
RAISE EXCEPTION 'limite insuficiente';
END IF;
UPDATE "Clientes" SET "Saldo" = saldo - p_valor WHERE "Id" = p_id
RETURNING "Saldo" AS novo_saldo, "Limite" AS novo_limite INTO novo_saldo, novo_limite;
ELSE
UPDATE "Clientes" SET "Saldo" = saldo + p_valor WHERE "Id" = p_id
RETURNING "Saldo" AS novo_saldo, "Limite" AS novo_limite INTO novo_saldo, novo_limite;
END IF;
-- Inserir na tabela de transações
INSERT INTO "Transacoes" ("Tipo", "Valor", "Descricao", "RealizadaEm", "ClienteId")
VALUES (p_tipo, p_valor, p_descricao, p_realizadaEm, p_id);
-- Retornar um record com os valores atualizados
resultado := (novo_saldo, novo_limite);
RETURN resultado;
END $$ LANGUAGE plpgsql;