Changes between Version 3 and Version 4 of DatabaseProgramming


Ignore:
Timestamp:
04/30/26 12:58:51 (2 days ago)
Author:
231027
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v3 v4  
    6767== Процедури
    6868
     69=== `proc_execute_purchase`
     70
     71Оваа процедура го менаџира целиот процес на продажба на билет во една сигурна трансакција. Ја пресметува точната цена, го евидентира купувачот и автоматски го заклучува билетот за да спречи негова повторна продажба.
     72
     73{{{
     74
     75CREATE OR REPLACE PROCEDURE proc_execute_purchase(p_uid BIGINT, p_tid BIGINT, p_qr VARCHAR) AS $$
     76BEGIN
     77    IF (SELECT is_available FROM "Ticket" WHERE ticket_id = p_tid) = FALSE THEN RAISE EXCEPTION 'Ticket is already sold'; END IF;
     78    INSERT INTO "Ticket_Purchase" (ticket_id, user_id, qr_code, purchase_amount)
     79    VALUES (p_tid, p_uid, p_qr, fn_calculate_price(p_tid));
     80    UPDATE "Ticket" SET is_available = FALSE WHERE ticket_id = p_tid;
     81END; $$ LANGUAGE plpgsql;
     82
     83}}}
     84
     85=== `proc_execute_refund`
     86
     87Ове е автоматизирана процедура за рефундирање која пресметува 85% поврат на средствата за корисникот. По успешното запишување на рефундацијата, таа веднаш го враќа билетот во продажба како „слободен“.
     88
     89{{{
     90
     91CREATE OR REPLACE PROCEDURE proc_execute_refund(p_purchase_id BIGINT) AS $$
     92DECLARE v_paid FLOAT4; v_tid BIGINT;
     93BEGIN
     94    SELECT purchase_amount, ticket_id INTO v_paid, v_tid FROM "Ticket_Purchase" WHERE purchase_id = p_purchase_id;
     95    INSERT INTO "Ticket_Refund" (purchase_id, refund_amount, refund_time) VALUES (p_purchase_id, v_paid * 0.85, CURRENT_TIMESTAMP);
     96    UPDATE "Ticket" SET is_available = TRUE WHERE ticket_id = v_tid;
     97END; $$ LANGUAGE plpgsql;
     98
     99}}}
     100
     101=== `proc_create_full_event`
     102
     103Оваа процедура овозможува креирање на комплетен настан заедно со неговиот термин и доделен изведувач со една команда. Процедурата ја користи логиката за проверка на достапност за да гарантира дека новиот настан не се поклопува со веќе постоечките.
     104
     105{{{
     106
     107CREATE OR REPLACE PROCEDURE proc_create_full_event(p_name VARCHAR, p_age INT, p_ven_id BIGINT, p_perf_id BIGINT, p_time TIMESTAMP, p_dur INT) AS $$
     108DECLARE v_eid BIGINT; v_hid BIGINT;
     109BEGIN
     110    IF NOT fn_check_resource_availability('VENUE', p_ven_id, p_time, p_dur) THEN RAISE EXCEPTION 'Venue is already booked for this time'; END IF;
     111    INSERT INTO "Event" (name, min_age) VALUES (p_name, p_age) RETURNING event_id INTO v_eid;
     112    INSERT INTO "Event_Happening" (event_id, venue_id, event_time, duration) VALUES (v_eid, p_ven_id, p_time, p_dur) RETURNING event_happening_id INTO v_hid;
     113    INSERT INTO "Event_Happening_Performer" (event_happening_id, performer_id) VALUES (v_hid, p_perf_id);
     114END; $$ LANGUAGE plpgsql;
     115
     116}}}
     117
    69118== Тригери