forked from zanfranceschi/rinha-de-backend-2024-q1
-
Notifications
You must be signed in to change notification settings - Fork 0
/
script.sql
61 lines (49 loc) · 1.64 KB
/
script.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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
CREATE TABLE clientes (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
limite INT NOT NULL,
saldo INT NOT NULL DEFAULT 0
);
CREATE TABLE transacoes (
id SERIAL PRIMARY KEY,
id_cliente INT NOT NULL,
valor INT NOT NULL,
tipo CHAR(1) NOT NULL CHECK (tipo IN ('c', 'd')),
descricao VARCHAR(10),
realizada_em TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_cliente) REFERENCES clientes(id)
);
CREATE OR REPLACE FUNCTION atualizar_saldo(id_cliente INTEGER, valor INTEGER, tipo CHAR, descricao VARCHAR)
RETURNS TABLE (saldo INTEGER, limite INTEGER) AS $$
DECLARE
novo_saldo INTEGER;
BEGIN
-- Verifiar se cliente existe
SELECT c.saldo, c.limite INTO saldo, limite FROM clientes c WHERE id = id_cliente;
IF NOT FOUND THEN
RAISE EXCEPTION 'CLIENTE_NAO_ENCONTRADO';
END IF;
IF tipo = 'c' THEN
saldo := saldo + valor;
ELSIF tipo = 'd' THEN
saldo := saldo - valor;
-- Verificar se o saldo após a transação de débito é menor que o limite
IF saldo < (-1 * limite) THEN
RAISE EXCEPTION 'LIMITE_EXECEDIDO';
END IF;
END IF;
novo_saldo := saldo;
INSERT INTO transacoes (id_cliente, valor, tipo, descricao) VALUES (id_cliente, valor, tipo, descricao);
UPDATE clientes SET saldo = novo_saldo WHERE id = id_cliente;
RETURN NEXT;
RETURN;
END;
$$ LANGUAGE plpgsql;
INSERT INTO
clientes (nome, limite)
VALUES
('o barato sai caro', 1000 * 100),
('zan corp ltda', 800 * 100),
('les cruders', 10000 * 100),
('padaria joia de cocaia', 100000 * 100),
('kid mais', 5000 * 100);