-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path33-store-procedures.sql
128 lines (95 loc) · 2.52 KB
/
33-store-procedures.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
-- Store procedures intro
CREATE OR REPLACE PROCEDURE insert_region_proc(INT, VARCHAR)
AS $$
-- DECLARE
BEGIN
INSERT INTO regions(region_id, region_name)
VALUES ($1, $2);
RAISE NOTICE 'Variable 1: %, 2: %', $1, $2
COMMIT;
-- ROLLBACK;
END;
$$ LANGUAGE plpgsql;
CALL insert_region_proc(5, 'Central America');
SELECT *
FROM regions;
-- Create a raise history
CREATE OR REPLACE PROCEDURE controlled_raise (percentage NUMERIC) AS $$
DECLARE
real_percentage NUMERIC(8,2);
total_employees INT;
BEGIN
real_percentage = percentage / 100;
-- Save the historical records
INSERT INTO raise_history (date, employee_id, base_salary, amount, percentage)
SELECT
CURRENT_DATE,
employee_id,
salary,
max_raise(employee_id) * real_percentage,
percentage
FROM employees;
-- Update the employees table
UPDATE employees
SET salary = salary + (max_raise(employee_id) * real_percentage);
SELECT COUNT(*) INTO total_employees
FROM employees;
RAISE NOTICE 'Affected % employees', total_employees
COMMIT;
END;
$$ LANGUAGE plpgsql;
CALL controlled_raise(1);
SELECT *
FROM employees;
SELECT *
FROM raise_history;
-- user_login procedure
CREATE EXTENSION IF NOT EXISTS pgcrypto;
INSERT INTO "user" (username, password, last_login, created_at, updated_at)
VALUES ('Melissa', crypt('123456', gen_salt('bf')), NULL, NOW(), NOW());
CREATE OR REPLACE PROCEDURE user_login(user_name VARCHAR, user_password VARCHAR) AS $$
DECLARE
was_found BOOLEAN;
found_user_id INT;
are_valid_credentials BOOLEAN;
BEGIN
SELECT COUNT(*) INTO was_found
FROM "user" WHERE username = user_name;
RAISE NOTICE 'was_found: %', was_found;
IF (was_found = false) THEN
RAISE EXCEPTION 'User not found: %', user_name;
END IF;
SELECT id INTO found_user_id
FROM "user" WHERE username = user_name;
SELECT COUNT(*) INTO are_valid_credentials
FROM "user"
WHERE id = found_user_id
AND password = crypt(user_password, password);
IF (are_valid_credentials = false) THEN
INSERT INTO session_failed (user_id)
VALUES (found_user_id);
COMMIT;
RAISE EXCEPTION 'Invalid credentials';
END IF;
UPDATE "user"
SET last_login = NOW()
WHERE username = user_name;
COMMIT;
RAISE NOTICE 'User with valid credentials: %', are_valid_credentials;
END;
$$ LANGUAGE plpgsql;
CALL user_login('Stiven', '12345');
SELECT *
FROM "user";
SELECT *
FROM session_failed;
ALTER TABLE session_failed
ADD CONSTRAINT fk_user_id
FOREIGN KEY (user_id)
REFERENCES "user" (id);
SELECT *
FROM session;
ALTER TABLE session
ADD CONSTRAINT fk_user_id
FOREIGN KEY (user_id)
REFERENCES "user" (id);