DatabaseProgramming: prodecures.sql

File prodecures.sql, 8.5 KB (added by 231105, 6 days ago)
Line 
1---------------PROCEDURE MARIJA I NINA-------------------------------------------------
2CREATE OR REPLACE PROCEDURE pr_sell_ticket(
3 IN p_passenger_embg CHAR(13),
4 IN p_passenger_id INT4,
5 IN p_trip_id INT4,
6 IN p_start_station_id INT4,
7 IN p_end_station_id INT4,
8 IN p_seat_number INT4,
9 IN p_carriage_number INT4,
10 IN p_price NUMERIC(2, 0),
11 IN p_payment_method VARCHAR(20),
12 OUT o_ticket_id INT4,
13 OUT o_payment_id INT4,
14 IN p_reservation_id INT4 DEFAULT NULL
15)
16LANGUAGE plpgsql
17AS $$
18DECLARE
19 v_passenger_exists INT;
20 v_trip_exists INT;
21 v_station_start_exists INT;
22 v_station_end_exists INT;
23 v_seat_taken INT;
24BEGIN
25 SELECT COUNT(*) INTO v_passenger_exists
26 FROM Passenger
27 WHERE PersonEMBG = p_passenger_embg AND passenger_id = p_passenger_id;
28
29 IF v_passenger_exists = 0 THEN
30 RAISE EXCEPTION 'Passenger with EMBG % and ID % does not exist.', p_passenger_embg, p_passenger_id;
31 END IF;
32
33 SELECT COUNT(*) INTO v_trip_exists FROM "Train Trip" WHERE trip_id = p_trip_id;
34 IF v_trip_exists = 0 THEN
35 RAISE EXCEPTION 'Train Trip ID % does not exist.', p_trip_id;
36 END IF;
37
38 SELECT COUNT(*) INTO v_station_start_exists FROM Station WHERE station_id = p_start_station_id;
39 SELECT COUNT(*) INTO v_station_end_exists FROM Station WHERE station_id = p_end_station_id;
40 IF v_station_start_exists = 0 OR v_station_end_exists = 0 THEN
41 RAISE EXCEPTION 'Invalid origin or destination station provided.';
42 END IF;
43
44 SELECT COUNT(*) INTO v_seat_taken
45 FROM Ticket
46 WHERE "Train Triptrip_id" = p_trip_id
47 AND carriage_number = p_carriage_number
48 AND seat_number = p_seat_number
49 AND ticket_status = 'Active';
50
51 IF v_seat_taken > 0 THEN
52 RAISE EXCEPTION 'Seat % in Carriage % is already booked for Trip %.', p_seat_number, p_carriage_number, p_trip_id;
53 END IF;
54
55 IF p_reservation_id IS NOT NULL THEN
56 UPDATE Reservation
57 SET status = 'Completed'
58 WHERE reservation_id = p_reservation_id;
59 END IF;
60
61 INSERT INTO Payment (
62 payment_method,
63 amount,
64 transaction_date,
65 Reservationreservation_id,
66 Passengerpassenger_id,
67 PassengerPersonEMBG2
68 )
69 VALUES (
70 p_payment_method,
71 p_price,
72 CURRENT_DATE,
73 p_reservation_id,
74 p_passenger_id,
75 p_passenger_embg
76 )
77 RETURNING payment_id INTO o_payment_id;
78
79 INSERT INTO Ticket (
80 seat_number,
81 carriage_number,
82 price,
83 ticket_status,
84 Paymentpayment_id,
85 "Train Triptrip_id",
86 Stationstation_id,
87 Stationstation_id2
88 )
89 VALUES (
90 p_seat_number,
91 p_carriage_number,
92 p_price,
93 'Active',
94 o_payment_id,
95 p_trip_id,
96 p_start_station_id,
97 p_end_station_id
98 )
99 RETURNING ticket_id INTO o_ticket_id;
100
101EXCEPTION
102 WHEN OTHERS THEN
103 RAISE NOTICE 'Transaction rolled back due to error: %', SQLERRM;
104 RAISE;
105END;
106$$;
107
108
109DO $$
110DECLARE
111 v_ticket_output INT4;
112 v_payment_output INT4;
113BEGIN
114 CALL pr_sell_ticket(
115 p_passenger_embg => '2510985918703',
116 p_passenger_id => 290,
117 p_trip_id => 4,
118 p_start_station_id => 10,
119 p_end_station_id => 14,
120 p_seat_number => 22,
121 p_carriage_number => 2,
122 p_price => 45,
123 p_payment_method => 'Apple Pay',
124 o_ticket_id => v_ticket_output,
125 o_payment_id => v_payment_output,
126 p_reservation_id => NULL
127 );
128
129 RAISE NOTICE 'Sale Complete! Ticket ID: %, Payment ID: %', v_ticket_output, v_payment_output;
130END $$;
131
132select * from ticket where ticket_id='23989062';
133-----------------------------------------------------------------------------------------
134---------Procedura 1 Marija ------------
135CREATE OR REPLACE PROCEDURE apply_seasonal_discount(p_route_id INT, p_discount_pct NUMERIC)
136AS $$
137BEGIN
138 UPDATE Ticket
139 SET price = price * (1 - p_discount_pct / 100)
140 WHERE "Train Triptrip_id" IN (
141 SELECT trip_id FROM "Train Trip" WHERE Routeroute_id = p_route_id
142 );
143
144 RAISE NOTICE 'Fares for route % have been reduced by %%%.', p_route_id, p_discount_pct;
145END;
146$$ LANGUAGE plpgsql;
147
148
149CALL apply_seasonal_discount(355, 20);
150
151SELECT t.ticket_id, t.price, t.ticket_status, tt.trip_id, tt.Routeroute_id
152FROM Ticket t
153JOIN "Train Trip" tt ON t."Train Triptrip_id" = tt.trip_id
154WHERE tt.Routeroute_id = 355;
155
156select * from "Train Trip" where Routeroute_id=355;
157
158---------Procedura 2 Marija ------------
159
160CREATE OR REPLACE PROCEDURE reassign_passengers_to_new_trip(p_cancelled_trip_id INT, p_new_trip_id INT)
161AS $$
162BEGIN
163 UPDATE Ticket
164 SET "Train Triptrip_id" = p_new_trip_id,
165 ticket_status = 'Reassigned'
166 WHERE "Train Triptrip_id" = p_cancelled_trip_id;
167
168 UPDATE "Train Trip"
169 SET trip_status = 'Cancelled'
170 WHERE trip_id = p_cancelled_trip_id;
171
172 RAISE NOTICE 'All passengers from % have been transferred to trip %.', p_cancelled_trip_id, p_new_trip_id;
173END;
174$$ LANGUAGE plpgsql;
175
176SELECT ticket_id, "Train Triptrip_id", ticket_status
177FROM Ticket
178WHERE "Train Triptrip_id" = 380477;
179
180SELECT ticket_id, "Train Triptrip_id", ticket_status
181FROM Ticket
182WHERE "Train Triptrip_id" = 200;
183
184CALL reassign_passengers_to_new_trip(380477, 200);
185
186-----Procedura 3 Marija ------------------
187
188CREATE OR REPLACE PROCEDURE change_trip_platform(
189 p_trip_id INT,
190 p_new_platform_id INT
191)
192AS $$
193BEGIN
194 UPDATE "Train Trip"
195 SET Platformplatform_id = p_new_platform_id
196 WHERE trip_id = p_trip_id;
197
198 RAISE NOTICE 'Trip % has been transferred to platform %.', p_trip_id, p_new_platform_id;
199END;
200$$ LANGUAGE plpgsql;
201
202
203CALL change_trip_platform(3300, 2);
204
205select * from "Train Trip" where trip_id=3300
206
207------Procedura 1 Nina------------
208
209CREATE OR REPLACE PROCEDURE cancel_reservation(p_reservation_id INT)
210AS $$
211BEGIN
212 UPDATE Reservation
213 SET status = 'Cancelled'
214 WHERE reservation_id = p_reservation_id;
215
216 UPDATE Ticket
217 SET ticket_status = 'Cancelled'
218 WHERE Paymentpayment_id IN (
219 SELECT payment_id
220 FROM Payment
221 WHERE Reservationreservation_id = p_reservation_id
222 );
223 RAISE NOTICE 'Reservation % has been canceled successfully.', p_reservation_id;
224END;
225$$ LANGUAGE plpgsql;
226
227SELECT * FROM Reservation where reservation_id = 17;
228
229SELECT * FROM Ticket
230WHERE Paymentpayment_id IN (
231 SELECT payment_id FROM Payment WHERE Reservationreservation_id = 17
232);
233
234CALL cancel_reservation(17);
235
236----------Procedura 2 Nina------------
237
238CREATE OR REPLACE PROCEDURE update_trip_delay(p_trip_id INT, p_delay_mins INT)
239AS $$
240BEGIN
241 UPDATE "Train Trip"
242 SET delay_minutes = p_delay_mins,
243 trip_status = CASE WHEN p_delay_mins > 0 THEN 'Delayed' ELSE 'On Time' END
244 WHERE trip_id = p_trip_id;
245
246 IF NOT FOUND THEN
247 RAISE EXCEPTION 'Trip with ID % not found.', p_trip_id;
248 END IF;
249END;
250$$ LANGUAGE plpgsql;
251
252CALL update_trip_delay(1220, 15);
253
254select * from "Train Trip" where trip_id=1220;
255
256
257-------Procedura 3 Nina--------------
258
259CREATE OR REPLACE PROCEDURE transfer_employee(
260 p_embg CHAR(13),
261 p_new_company_id INT
262)
263AS $$
264BEGIN
265 IF NOT EXISTS (SELECT 1 FROM Company WHERE company_id = p_new_company_id) THEN
266 RAISE EXCEPTION 'Company ID % does not exist.', p_new_company_id;
267 END IF;
268
269 UPDATE Employee
270 SET Companycompany_id = p_new_company_id
271 WHERE PersonEMBG = p_embg;
272
273 RAISE NOTICE 'Employee with EMBG % has been successfully transferred to company %.', p_embg, p_new_company_id;
274END;
275$$ LANGUAGE plpgsql;
276
277CALL transfer_employee('2005992333958', 4);
278
279select * from employee where PersonEMBG='2005992333958'
280
281
282----------- Procedura 2 Ana ----------------
283
284CREATE OR REPLACE PROCEDURE assign_platform_to_trip(
285 p_trip_id INT,
286 p_platform_id INT,
287 p_station_id INT
288)
289AS $$
290BEGIN
291 UPDATE "Train Trip"
292 SET Platformplatform_id = p_platform_id,
293 PlatformStationstation_id = p_station_id
294 WHERE trip_id = p_trip_id;
295
296 IF NOT FOUND THEN
297 RAISE EXCEPTION 'Trip with ID % not found.', p_trip_id;
298 END IF;
299
300 RAISE NOTICE 'Platform % assigned to trip %.',
301 p_platform_id, p_trip_id;
302END;
303$$ LANGUAGE plpgsql;
304CALL assign_platform_to_trip(3300, 3, 1084);