Changes between Version 5 and Version 6 of функции,процедури,тригери
- Timestamp:
- 06/16/26 10:39:48 (9 days ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
функции,процедури,тригери
v5 v6 1 1 --------------Функции------------------------------ 2 2 ---------- Вкупна цена со попуст--------- 3 3 4 CREATE OR REPLACE FUNCTION get_reservation_total_with_discount( 4 5 p_reservation_id INT, … … 11 12 v_final FLOAT; 12 13 BEGIN 13 -- Вкупна цена на сите тикети за резервацијата14 14 SELECT SUM(price) 15 15 INTO v_total … … 17 17 WHERE reservation_id = p_reservation_id; 18 18 19 -- Попустот од промоцијата (во проценти) 19 20 20 SELECT discount 21 21 INTO v_discount … … 23 23 WHERE promotion_id = p_promotion_id; 24 24 25 -- Пресметај крајна цена25 26 26 v_final := v_total - (v_total * v_discount / 100); 27 27 … … 42 42 v_sold INT; 43 43 BEGIN 44 -- Капацитет на салата 44 45 45 SELECT ch.capacity 46 46 INTO v_capacity … … 49 49 WHERE s.screening_id = p_screening_id; 50 50 51 -- Продадени тикети 51 52 52 SELECT COUNT(*) 53 53 INTO v_sold … … 96 96 v_screening_date DATE; 97 97 BEGIN 98 -- Провери дали проекцијата постои 98 99 99 IF NOT EXISTS (SELECT 1 FROM SCREENING WHERE screening_id = p_screening_id) THEN 100 100 RAISE EXCEPTION 'Проекцијата со ID % не постои!', p_screening_id; 101 101 END IF; 102 102 103 -- Провери дали датумот на проекцијата не е во минатото 103 104 104 SELECT date INTO v_screening_date FROM SCREENING WHERE screening_id = p_screening_id; 105 105 IF v_screening_date < CURRENT_DATE THEN … … 107 107 END IF; 108 108 109 -- Провери дали цената е валидна 109 110 110 IF p_price <= 0 THEN 111 111 RAISE EXCEPTION 'Цената мора да биде поголема од 0!'; 112 112 END IF; 113 113 114 -- Земи ја салата 114 115 115 SELECT cinemahall_id INTO v_cinemahall_id 116 116 FROM SCREENING WHERE screening_id = p_screening_id; 117 117 118 -- Провери дали салата постои 118 119 119 IF NOT EXISTS (SELECT 1 FROM CINEMA_HALL WHERE cinemahall_id = v_cinemahall_id) THEN 120 120 RAISE EXCEPTION 'Салата со ID % не постои!', v_cinemahall_id; 121 121 END IF; 122 122 123 -- Провери дали салата е активна 123 124 124 IF NOT EXISTS (SELECT 1 FROM CINEMA_HALL WHERE cinemahall_id = v_cinemahall_id AND status = 'ACTIVE') THEN 125 125 RAISE EXCEPTION 'Салата со ID % не е активна!', v_cinemahall_id; 126 126 END IF; 127 127 128 -- Провери дали киното постои 128 129 129 SELECT cinema_id INTO v_cinema_id FROM CINEMA_HALL WHERE cinemahall_id = v_cinemahall_id; 130 130 IF NOT EXISTS (SELECT 1 FROM CINEMA WHERE cinema_id = v_cinema_id) THEN … … 132 132 END IF; 133 133 134 -- Провери дали воопшто има седишта во салата 134 135 135 IF NOT EXISTS (SELECT 1 FROM SEAT WHERE cinemahall_id = v_cinemahall_id) THEN 136 136 RAISE EXCEPTION 'Салата со ID % нема седишта!', v_cinemahall_id; 137 137 END IF; 138 138 139 -- За секое седиште во салата креирај тикет 139 140 140 FOR v_seat IN 141 141 SELECT seat_id FROM SEAT WHERE cinemahall_id = v_cinemahall_id … … 180 180 v_total_price FLOAT := 0; 181 181 BEGIN 182 -- Провери дали тикетот постои 182 183 183 IF NOT EXISTS (SELECT 1 FROM TICKET WHERE ticket_id = p_ticket_id) THEN 184 184 RAISE EXCEPTION 'Тикетот со ID % не постои!', p_ticket_id; 185 185 END IF; 186 186 187 -- Провери дали тикетот е слободен 187 188 188 IF EXISTS (SELECT 1 FROM TICKET WHERE ticket_id = p_ticket_id AND user_id IS NOT NULL) THEN 189 189 RAISE EXCEPTION 'Тикетот со ID % е веќе купен!', p_ticket_id; 190 190 END IF; 191 191 192 -- Провери дали корисникот постои 192 193 193 IF NOT EXISTS (SELECT 1 FROM "USER" WHERE user_id = p_user_id) THEN 194 194 RAISE EXCEPTION 'Корисникот % не постои!', p_user_id; 195 195 END IF; 196 196 197 -- Провери дали резервацијата постои 197 198 198 IF NOT EXISTS (SELECT 1 FROM RESERVATION WHERE reservation_id = p_reservation_id) THEN 199 199 RAISE EXCEPTION 'Резервацијата со ID % не постои!', p_reservation_id; 200 200 END IF; 201 201 202 -- Провери дали резервацијата не е откажана 202 203 203 IF EXISTS (SELECT 1 FROM RESERVATION WHERE reservation_id = p_reservation_id AND status = 'CANCELLED') THEN 204 204 RAISE EXCEPTION 'Резервацијата со ID % е откажана!', p_reservation_id; 205 205 END IF; 206 206 207 -- Провери дали проекцијата не е во минатото 207 208 208 SELECT screening_id INTO v_screening_id FROM TICKET WHERE ticket_id = p_ticket_id; 209 209 SELECT date INTO v_screening_date FROM SCREENING WHERE screening_id = v_screening_id; … … 212 212 END IF; 213 213 214 -- Провери дали производите постојат и пресметај вкупна цена 214 215 215 FOREACH v_product_id IN ARRAY p_products 216 216 LOOP … … 222 222 END LOOP; 223 223 224 -- Ажурирај го тикетот 224 225 225 UPDATE TICKET 226 226 SET user_id = p_user_id, … … 228 228 WHERE ticket_id = p_ticket_id; 229 229 230 -- Додај ги производите 230 231 231 FOREACH v_product_id IN ARRAY p_products 232 232 LOOP … … 261 261 v_avg_rating FLOAT; 262 262 BEGIN 263 -- Провери дали корисникот постои 263 264 264 IF NOT EXISTS (SELECT 1 FROM "USER" WHERE user_id = p_user_id) THEN 265 265 RAISE EXCEPTION 'Корисникот % не постои!', p_user_id; 266 266 END IF; 267 267 268 -- Провери дали филмот постои 268 269 269 IF NOT EXISTS (SELECT 1 FROM MOVIE WHERE movie_id = p_movie_id) THEN 270 270 RAISE EXCEPTION 'Филмот со ID % не постои!', p_movie_id; 271 271 END IF; 272 272 273 -- Провери дали рејтингот е валиден 273 274 274 IF p_rating < 1 OR p_rating > 10 THEN 275 275 RAISE EXCEPTION 'Рејтингот мора да биде помеѓу 1 и 10! Внесен рејтинг: %', p_rating; 276 276 END IF; 277 277 278 -- Провери дали коментарот е празен 278 279 279 IF p_comment IS NULL OR TRIM(p_comment) = '' THEN 280 280 RAISE EXCEPTION 'Коментарот не може да биде празен!'; 281 281 END IF; 282 282 283 -- Провери дали корисникот купил тикет за овој филм 283 284 284 IF NOT EXISTS ( 285 285 SELECT 1 FROM TICKET t … … 291 291 END IF; 292 292 293 -- Провери дали корисникот веќе оставил review за овој филм 293 294 294 IF EXISTS (SELECT 1 FROM REVIEW WHERE user_id = p_user_id AND movie_id = p_movie_id) THEN 295 295 RAISE EXCEPTION 'Корисникот % веќе оставил review за филмот %!', p_user_id, p_movie_id; 296 296 END IF; 297 297 298 -- Додај review299 298 INSERT INTO REVIEW (comment, date, user_id, movie_id, rating) 300 299 VALUES (p_comment, CURRENT_DATE, p_user_id, p_movie_id, p_rating); 301 300 302 -- Пресметај нов просечен рејтинг 301 303 302 SELECT COUNT(*), ROUND(AVG(rating)::numeric, 2) 304 303 INTO v_existing_reviews, v_avg_rating
