-
Notifications
You must be signed in to change notification settings - Fork 923
/
Copy pathinit.sql
65 lines (58 loc) · 1.86 KB
/
init.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
62
63
64
65
CREATE UNLOGGED TABLE clientes (
id SERIAL PRIMARY KEY,
nome VARCHAR(50) NOT NULL,
limite INTEGER NOT NULL,
saldo INTEGER NOT NULL DEFAULT 0,
CONSTRAINT valida_saldo CHECK (saldo >= (- limite))
);
CREATE UNLOGGED TABLE transacoes (
id SERIAL PRIMARY KEY,
cliente_id INTEGER NOT NULL,
valor INTEGER NOT NULL,
tipo CHAR(1) NOT NULL,
descricao VARCHAR(10) NOT NULL,
realizada_em TIMESTAMP NOT NULL DEFAULT NOW()
--CONSTRAINT fk_clientes_transacoes_id FOREIGN KEY (cliente_id) REFERENCES clientes(id)
);
DO $$
BEGIN
INSERT INTO clientes (nome, limite)
VALUES
('Fulano', 1000 * 100),
('Beltrano', 800 * 100),
('Cicrano', 10000 * 100),
('Deutrano', 100000 * 100),
('Eutrano', 5000 * 100);
END;
$$;
CREATE OR REPLACE FUNCTION inserir_transacao_credito_e_retornar_saldo (
clienteid_in int,
valor_in int,
descricao_in varchar(10)
)
RETURNS int
AS $$
DECLARE saldo_atualizado int;
BEGIN
INSERT INTO "transacoes" ("cliente_id", "valor", "tipo", "descricao") values (clienteid_in, valor_in, 'c', descricao_in);
UPDATE "clientes" set "saldo" = "saldo" + valor_in where "id" = clienteid_in RETURNING "saldo" into saldo_atualizado;
return saldo_atualizado;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION inserir_transacao_debito_e_retornar_saldo (
clienteid_in int,
valor_in int,
descricao_in varchar(10)
)
RETURNS int
AS $$
DECLARE saldo_atualizado int;
BEGIN
UPDATE "clientes" set "saldo" = "saldo" - valor_in where "id" = clienteid_in and "saldo" - valor_in >= ("limite" * -1) returning "saldo" into saldo_atualizado;
IF saldo_atualizado IS NOT NULL THEN
INSERT INTO "transacoes" ("cliente_id", "valor", "tipo", "descricao") values (clienteid_in, valor_in, 'd', descricao_in);
END IF;
RETURN saldo_atualizado;
END;
$$ LANGUAGE plpgsql;
CREATE INDEX idx_transacoes_on_cliente_id_realizado_em ON transacoes USING btree (cliente_id, realizada_em);