Changes between Version 5 and Version 6 of функции,процедури,тригери


Ignore:
Timestamp:
06/16/26 10:39:48 (9 days ago)
Author:
231233
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • функции,процедури,тригери

    v5 v6  
    11--------------Функции------------------------------
    22---------- Вкупна цена со попуст---------
     3
    34CREATE OR REPLACE FUNCTION get_reservation_total_with_discount(
    45    p_reservation_id INT,
     
    1112    v_final FLOAT;
    1213BEGIN
    13     -- Вкупна цена на сите тикети за резервацијата
    1414    SELECT SUM(price)
    1515    INTO v_total
     
    1717    WHERE reservation_id = p_reservation_id;
    1818
    19     -- Попустот од промоцијата (во проценти)
     19
    2020    SELECT discount
    2121    INTO v_discount
     
    2323    WHERE promotion_id = p_promotion_id;
    2424
    25     -- Пресметај крајна цена
     25 
    2626    v_final := v_total - (v_total * v_discount / 100);
    2727
     
    4242    v_sold INT;
    4343BEGIN
    44     -- Капацитет на салата
     44
    4545    SELECT ch.capacity
    4646    INTO v_capacity
     
    4949    WHERE s.screening_id = p_screening_id;
    5050
    51     -- Продадени тикети
     51
    5252    SELECT COUNT(*)
    5353    INTO v_sold
     
    9696    v_screening_date DATE;
    9797BEGIN
    98     -- Провери дали проекцијата постои
     98
    9999    IF NOT EXISTS (SELECT 1 FROM SCREENING WHERE screening_id = p_screening_id) THEN
    100100        RAISE EXCEPTION 'Проекцијата со ID % не постои!', p_screening_id;
    101101    END IF;
    102102
    103     -- Провери дали датумот на проекцијата не е во минатото
     103
    104104    SELECT date INTO v_screening_date FROM SCREENING WHERE screening_id = p_screening_id;
    105105    IF v_screening_date < CURRENT_DATE THEN
     
    107107    END IF;
    108108
    109     -- Провери дали цената е валидна
     109
    110110    IF p_price <= 0 THEN
    111111        RAISE EXCEPTION 'Цената мора да биде поголема од 0!';
    112112    END IF;
    113113
    114     -- Земи ја салата
     114
    115115    SELECT cinemahall_id INTO v_cinemahall_id
    116116    FROM SCREENING WHERE screening_id = p_screening_id;
    117117
    118     -- Провери дали салата постои
     118
    119119    IF NOT EXISTS (SELECT 1 FROM CINEMA_HALL WHERE cinemahall_id = v_cinemahall_id) THEN
    120120        RAISE EXCEPTION 'Салата со ID % не постои!', v_cinemahall_id;
    121121    END IF;
    122122
    123     -- Провери дали салата е активна
     123
    124124    IF NOT EXISTS (SELECT 1 FROM CINEMA_HALL WHERE cinemahall_id = v_cinemahall_id AND status = 'ACTIVE') THEN
    125125        RAISE EXCEPTION 'Салата со ID % не е активна!', v_cinemahall_id;
    126126    END IF;
    127127
    128     -- Провери дали киното постои
     128
    129129    SELECT cinema_id INTO v_cinema_id FROM CINEMA_HALL WHERE cinemahall_id = v_cinemahall_id;
    130130    IF NOT EXISTS (SELECT 1 FROM CINEMA WHERE cinema_id = v_cinema_id) THEN
     
    132132    END IF;
    133133
    134     -- Провери дали воопшто има седишта во салата
     134
    135135    IF NOT EXISTS (SELECT 1 FROM SEAT WHERE cinemahall_id = v_cinemahall_id) THEN
    136136        RAISE EXCEPTION 'Салата со ID % нема седишта!', v_cinemahall_id;
    137137    END IF;
    138138
    139     -- За секое седиште во салата креирај тикет
     139
    140140    FOR v_seat IN
    141141        SELECT seat_id FROM SEAT WHERE cinemahall_id = v_cinemahall_id
     
    180180    v_total_price FLOAT := 0;
    181181BEGIN
    182     -- Провери дали тикетот постои
     182
    183183    IF NOT EXISTS (SELECT 1 FROM TICKET WHERE ticket_id = p_ticket_id) THEN
    184184        RAISE EXCEPTION 'Тикетот со ID % не постои!', p_ticket_id;
    185185    END IF;
    186186
    187     -- Провери дали тикетот е слободен
     187
    188188    IF EXISTS (SELECT 1 FROM TICKET WHERE ticket_id = p_ticket_id AND user_id IS NOT NULL) THEN
    189189        RAISE EXCEPTION 'Тикетот со ID % е веќе купен!', p_ticket_id;
    190190    END IF;
    191191
    192     -- Провери дали корисникот постои
     192
    193193    IF NOT EXISTS (SELECT 1 FROM "USER" WHERE user_id = p_user_id) THEN
    194194        RAISE EXCEPTION 'Корисникот % не постои!', p_user_id;
    195195    END IF;
    196196
    197     -- Провери дали резервацијата постои
     197
    198198    IF NOT EXISTS (SELECT 1 FROM RESERVATION WHERE reservation_id = p_reservation_id) THEN
    199199        RAISE EXCEPTION 'Резервацијата со ID % не постои!', p_reservation_id;
    200200    END IF;
    201201
    202     -- Провери дали резервацијата не е откажана
     202
    203203    IF EXISTS (SELECT 1 FROM RESERVATION WHERE reservation_id = p_reservation_id AND status = 'CANCELLED') THEN
    204204        RAISE EXCEPTION 'Резервацијата со ID % е откажана!', p_reservation_id;
    205205    END IF;
    206206
    207     -- Провери дали проекцијата не е во минатото
     207
    208208    SELECT screening_id INTO v_screening_id FROM TICKET WHERE ticket_id = p_ticket_id;
    209209    SELECT date INTO v_screening_date FROM SCREENING WHERE screening_id = v_screening_id;
     
    212212    END IF;
    213213
    214     -- Провери дали производите постојат и пресметај вкупна цена
     214
    215215    FOREACH v_product_id IN ARRAY p_products
    216216    LOOP
     
    222222    END LOOP;
    223223
    224     -- Ажурирај го тикетот
     224
    225225    UPDATE TICKET
    226226    SET user_id = p_user_id,
     
    228228    WHERE ticket_id = p_ticket_id;
    229229
    230     -- Додај ги производите
     230
    231231    FOREACH v_product_id IN ARRAY p_products
    232232    LOOP
     
    261261    v_avg_rating FLOAT;
    262262BEGIN
    263     -- Провери дали корисникот постои
     263
    264264    IF NOT EXISTS (SELECT 1 FROM "USER" WHERE user_id = p_user_id) THEN
    265265        RAISE EXCEPTION 'Корисникот % не постои!', p_user_id;
    266266    END IF;
    267267
    268     -- Провери дали филмот постои
     268
    269269    IF NOT EXISTS (SELECT 1 FROM MOVIE WHERE movie_id = p_movie_id) THEN
    270270        RAISE EXCEPTION 'Филмот со ID % не постои!', p_movie_id;
    271271    END IF;
    272272
    273     -- Провери дали рејтингот е валиден
     273
    274274    IF p_rating < 1 OR p_rating > 10 THEN
    275275        RAISE EXCEPTION 'Рејтингот мора да биде помеѓу 1 и 10! Внесен рејтинг: %', p_rating;
    276276    END IF;
    277277
    278     -- Провери дали коментарот е празен
     278
    279279    IF p_comment IS NULL OR TRIM(p_comment) = '' THEN
    280280        RAISE EXCEPTION 'Коментарот не може да биде празен!';
    281281    END IF;
    282282
    283     -- Провери дали корисникот купил тикет за овој филм
     283
    284284    IF NOT EXISTS (
    285285        SELECT 1 FROM TICKET t
     
    291291    END IF;
    292292
    293     -- Провери дали корисникот веќе оставил review за овој филм
     293
    294294    IF EXISTS (SELECT 1 FROM REVIEW WHERE user_id = p_user_id AND movie_id = p_movie_id) THEN
    295295        RAISE EXCEPTION 'Корисникот % веќе оставил review за филмот %!', p_user_id, p_movie_id;
    296296    END IF;
    297297
    298     -- Додај review
    299298    INSERT INTO REVIEW (comment, date, user_id, movie_id, rating)
    300299    VALUES (p_comment, CURRENT_DATE, p_user_id, p_movie_id, p_rating);
    301300
    302     -- Пресметај нов просечен рејтинг
     301
    303302    SELECT COUNT(*), ROUND(AVG(rating)::numeric, 2)
    304303    INTO v_existing_reviews, v_avg_rating