-
Notifications
You must be signed in to change notification settings - Fork 0
/
projekt_sql.sql
292 lines (250 loc) · 8.08 KB
/
projekt_sql.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
--Tomasz Stelągowski
--3ci etap zadania zaliczeniowego
--Creaty i Skrypty PL/SQL
DROP TABLE to_do_lists;
DROP TABLE to_do_items;
DROP TABLE to_do_single_items;
DROP TABLE travel_time;
DROP TABLE events;
DROP TABLE locations;
DROP TABLE types;
DROP TABLE users;
DROP TABLE links;
DROP VIEW view_get_task_list;
DROP SEQUENCE links_id;
DROP SEQUENCE single_items_id;
DROP SEQUENCE types_id;
DROP SEQUENCE locations_id;
DROP SEQUENCE events_id;
DROP SEQUENCE travel_time_id;
DROP SEQUENCE to_do_single_items_id;
DROP SEQUENCE to_do_items_id;
DROP SEQUENCE to_do_lists_id;
DROP TRIGGER links_insert_id;
DROP TRIGGER users_insert_id;
DROP TRIGGER types_insert_id;
DROP TRIGGER locations_insert_id;
DROP TRIGGER events_insert_id;
DROP TRIGGER travel_time_insert_id;
DROP TRIGGER to_do_single_items_insert_id;
DROP TRIGGER to_do_items_insert_id;
DROP TRIGGER to_do_lists_insert_id;
--tabela Links
CREATE TABLE links (
id INTEGER PRIMARY KEY,
name VARCHAR(20) UNIQUE,
link VARCHAR(250) UNIQUE
);
--tabela users
CREATE TABLE users (
id INTEGER PRIMARY KEY,
login VARCHAR(10) UNIQUE,
password RAW(16) NOT NULL,
name VARCHAR(10),
surname VARCHAR(20),
from_usos char(1) NOT NULL CHECK (from_usos IN ('Y','N')),
CONSTRAINT login_or_name
CHECK (NOT(login IS NULL AND name IS NULL AND surname IS NULL)
AND ((name IS NOT NULL AND surname IS NOT NULL) OR (name IS NULL AND surname IS NULL)))
);
--events types
CREATE TABLE types (
id INTEGER PRIMARY KEY,
name VARCHAR(10) UNIQUE,
description VARCHAR(250)
);
INSERT INTO types (name, description) VALUES ('GENERAL', 'General type fo all untyped events');
--lokalizacje *(dodane)
CREATE TABLE locations (
id INTEGER PRIMARY KEY,
name VARCHAR(10),
street VARCHAR(250),
home_number VARCHAR(10),
zip_code VARCHAR(6),
CONSTRAINT unique_address UNIQUE ( street, home_number, zip_code )
);
--tabela events
CREATE TABLE events (
id INTEGER PRIMARY KEY,
name VARCHAR(10),
start_time DATE,
end_time DATE,
full_day char(1) CHECK (full_day IN ('Y','N')),
type INTEGER REFERENCES types,
attended char(1) CHECK (attended IN ('Y','N')),
c_user INTEGER REFERENCES users,
t_user INTEGER REFERENCES users,
location INTEGER REFERENCES locations,
CONSTRAINT is_full_day
CHECK ((full_day='Y' AND end_time IS NULL) OR (full_day='N' AND end_time IS NOT NULL))
);
--czasy podróży
CREATE TABLE travel_time (
id INTEGER PRIMARY KEY,
from_dest INTEGER REFERENCES locations,
to_dest INTEGER REFERENCES locations,
start_time DATE,
end_time DATE,
arrival char(1) NOT NULL CHECK (arrival IN ('Y','N')),
event INTEGER REFERENCES events
);
-- To do single items
CREATE TABLE to_do_single_items (
id INTEGER PRIMARY KEY,
name VARCHAR(20),
type INTEGER NOT NULL REFERENCES types,
c_user INTEGER NOT NULL REFERENCES users,
t_user INTEGER NOT NULL REFERENCES users
);
-- To do items
CREATE TABLE to_do_items (
id INTEGER PRIMARY KEY,
event_item INTEGER REFERENCES events,
single_item INTEGER REFERENCES to_do_single_items,
done CHAR(1) NOT NULL CHECK (done IN ('Y','N')),
CONSTRAINT one_item
CHECK ((event_item IS NULL AND single_item IS NOT NULL)
OR (event_item IS NOT NULL AND single_item IS NULL))
);
--To do List
CREATE TABLE to_do_lists (
id INTEGER PRIMARY KEY,
day DATE,
rank INTEGER,
item INTEGER REFERENCES to_do_items
);
-----------------------------------------------------------
-- Blok odpowiadający za autoincrementy kluczy głównych tabel
CREATE SEQUENCE links_id START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE users_id START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE types_id START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE locations_id START WITH 1 INCREMENT BY 1;
--single items are addition to events to appear on to do lists therefor
--I prefer indexing them with common index
CREATE SEQUENCE events_or_single_item_id START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE travel_time_id START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE to_do_items_id START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE to_do_lists_id START WITH 1 INCREMENT BY 1;
CREATE OR REPLACE TRIGGER links_insert_id BEFORE INSERT ON links
FOR EACH ROW
BEGIN
SELECT links_id.nextval INTO :NEW.id from dual;
END;
/
CREATE OR REPLACE TRIGGER users_insert_id BEFORE INSERT ON users
FOR EACH ROW
BEGIN
SELECT users_id.nextval INTO :NEW.id from dual;
END;
/
CREATE OR REPLACE TRIGGER types_insert_id BEFORE INSERT ON types
FOR EACH ROW
BEGIN
SELECT types_id.nextval INTO :NEW.id from dual;
END;
/
CREATE OR REPLACE TRIGGER locations_insert_id BEFORE INSERT ON locations
FOR EACH ROW
BEGIN
SELECT locations_id.nextval INTO :NEW.id from dual;
END;
/
CREATE OR REPLACE TRIGGER events_insert_id BEFORE INSERT ON events
FOR EACH ROW
BEGIN
SELECT events_or_single_item_id.nextval INTO :NEW.id from dual;
END;
/
CREATE OR REPLACE TRIGGER travel_time_insert_id BEFORE INSERT ON travel_time
FOR EACH ROW
BEGIN
SELECT travel_time_id.nextval INTO :NEW.id from dual;
SELECT NVL( :NEW.arrival, 'N' ) INTO :NEW.arrival from dual;
END;
/
CREATE OR REPLACE TRIGGER to_do_single_items_insert_id BEFORE INSERT ON to_do_single_items
FOR EACH ROW
BEGIN
SELECT events_or_single_item_id.nextval INTO :NEW.id from dual;
END;
/
CREATE OR REPLACE TRIGGER to_do_items_insert_id BEFORE INSERT ON to_do_items
FOR EACH ROW
BEGIN
SELECT to_do_items_id.nextval INTO :NEW.id from dual;
END;
/
CREATE OR REPLACE TRIGGER to_do_lists_insert_id BEFORE INSERT ON to_do_lists
FOR EACH ROW
BEGIN
SELECT to_do_lists_id.nextval INTO :NEW.id from dual;
END;
/
--Koniec bloku odpowiadającego za autoincrementy
-----------------------------------------------------------
-------------------------------------------------
-- Blok Widoków
CREATE VIEW view_get_task_list AS
SELECT B.id, A.name, D.name as type_name, E.login, E.name as user_name, E.surname, A.t_user, B.done, C.day, C.rank
FROM to_do_single_items A, to_do_items B, to_do_lists C, types D, users E
WHERE B.id = C.item and B.single_item = A.id and D.id = A.type and A.c_user = E.id
UNION
SELECT B.id, A.name, D.name as type_name, E.login, E.name as user_name, E.surname, A.t_user, B.done, C.day, C.rank
FROM events A, to_do_items B, to_do_lists C, types D, users E
WHERE B.id = C.item and B.event_item = A.id and D.id = A.type and A.c_user = E.id;
-- koniec bloku widoków
-------------------------------------------------
-------------------------------------------------
-- Blok funkcji
--new user
CREATE OR REPLACE PROCEDURE add_user (login IN VARCHAR, name IN VARCHAR, surname IN VARCHAR, password IN VARCHAR)
IS
enc_pass RAW(32);
BEGIN
select standard_hash(add_user.password, 'MD5') INTO enc_pass from dual;
IF login IS NOT NULL THEN
INSERT INTO users (login, password, from_usos) VALUES (add_user.login, enc_pass, 'N');
ELSE
INSERT INTO users (name, surname, password, from_usos) VALUES (add_user.name, add_user.surname, enc_pass, 'N');
END IF;
END;
/
--create task
CREATE OR REPLACE PROCEDURE add_to_do_item (name IN VARCHAR, type IN INT, c_user IN INT, t_user IN INT, datum IN DATE, rank IN INT)
IS
last_single_item INT;
last_to_do_item INT;
BEGIN
INSERT INTO to_do_single_items (name, type, c_user, t_user) VALUES (name, type, c_user, t_user) RETURNING id INTO last_single_item;
INSERT INTO to_do_items (single_item, done) VALUES (last_single_item, 'N') RETURNING id INTO last_to_do_item;
INSERT INTO to_do_lists (day, rank, item) VALUES (datum, rank, last_to_do_item);
END;
/
--create task
CREATE OR REPLACE PROCEDURE modify_to_do_item (idin IN INT, donein IN VARCHAR)
IS
last_single_item INT;
BEGIN
UPDATE to_do_items SET DONE = donein WHERE ID = idin;
END;
/
--Zmiana dnia listy zadan
CREATE OR REPLACE PROCEDURE change_day_of_to_do_list (now_day IN DATE, new_day IN DATE)
IS
nr INT;
CURSOR current_list IS
SELECT day, rank FROM to_do_lists WHERE TRUNC(day, 'DD') = TRUNC(change_day_of_to_do_list.now_day, 'DD')
ORDER BY rank ASC FOR UPDATE OF day, rank;
BEGIN
SELECT MAX(rank)+1 INTO nr FROM to_do_lists WHERE TRUNC(day, 'DD') = TRUNC(change_day_of_to_do_list.new_day, 'DD');
FOR item_on_list IN current_list
LOOP
UPDATE to_do_lists SET day=change_day_of_to_do_list.new_day, rank=nr
WHERE CURRENT OF current_list;
COMMIT;
nr:=nr+1;
END LOOP;
END;
/
--Koniec Bloku funkcji
------------------------------------------------