Changes between Version 62 and Version 63 of DatabaseProgramming


Ignore:
Timestamp:
05/20/26 22:17:34 (6 days ago)
Author:
231109
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v62 v63  
    175175
    176176CALL cancel_reservation(17);
    177 
    178177}}}
    179178Оваа процедура ја поништува резервацијата и автоматски ги ажурира поврзаните податоци. Кога ќе се повика, статусот на резервацијата се менува во "Cancelled", а сите билети поврзани со таа резервација исто така се означуваат како "Cancelled" Се користи за правилно откажување на резервации и одржување конзистентност меѓу резервациите, плаќањата и билетите.
     
    181180=== Процедура 3 : apply_seasonal_discount
    182181
    183 [[Image("Screenshot 2026-05-20 161953.png", 300px)]]
    184 
     182{{{
     183#!sql
     184CREATE OR REPLACE PROCEDURE apply_seasonal_discount(p_route_id INT, p_discount_pct NUMERIC)
     185AS $$
     186BEGIN
     187    UPDATE Ticket
     188    SET price = price * (1 - p_discount_pct / 100)
     189    WHERE "Train Triptrip_id" IN (
     190        SELECT trip_id FROM "Train Trip" WHERE Routeroute_id = p_route_id
     191    );
     192
     193    RAISE NOTICE 'Fares for route % have been reduced by %%%.', p_route_id, p_discount_pct;
     194END;
     195$$ LANGUAGE plpgsql;
     196
     197
     198CALL apply_seasonal_discount(355, 20);
     199
     200SELECT t.ticket_id, t.price, t.ticket_status, tt.trip_id, tt.Routeroute_id
     201FROM Ticket t
     202JOIN "Train Trip" tt ON t."Train Triptrip_id" = tt.trip_id
     203WHERE tt.Routeroute_id = 355;
     204
     205select * from "Train Trip" where Routeroute_id=355;
     206}}}
    185207Оваа процедура применува сезонски попуст на билетите за сите патувања што припаѓаат на одредена рута. Кога ќе се повика, ја намалува цената на билетите за даден процент и автоматски ги ажурира сите поврзани записи. Се користи за промоции и динамично формирање на цени по рути.
    186208
    187209=== Процедура 4 : update_trip_delay
    188210
    189 [[Image("Screenshot 2026-05-20 161643.png", 300px)]]
    190 
     211{{{
     212#!sql
     213CREATE OR REPLACE PROCEDURE update_trip_delay(p_trip_id INT, p_delay_mins INT)
     214AS $$
     215BEGIN
     216    UPDATE "Train Trip"
     217    SET delay_minutes = p_delay_mins,
     218        trip_status = CASE WHEN p_delay_mins > 0 THEN 'Delayed' ELSE 'On Time' END
     219    WHERE trip_id = p_trip_id;
     220
     221    IF NOT FOUND THEN
     222        RAISE EXCEPTION 'Trip with ID % not found.', p_trip_id;
     223    END IF;
     224END;
     225$$ LANGUAGE plpgsql;
     226
     227CALL update_trip_delay(1220, 15);
     228
     229select * from "Train Trip" where trip_id=1220;
     230}}}
    191231Оваа процедура го ажурира доцнењето и статусот на едно патување. Кога ќе се повика, го поставува бројот на минути на доцнење и автоматски го менува статусот во "Delayed" ако има доцнење или "On Time" ако нема. Се користи за брзо и точно ажурирање на состојбата на возовите во реално време.
    192232
    193233=== Процедура 5 : reassign_passengers_to_new_trip
    194234
    195 [[Image("Screenshot 2026-05-20 162556.png", 300px)]]
    196 
     235{{{
     236#!sql
     237CREATE OR REPLACE PROCEDURE reassign_passengers_to_new_trip(p_cancelled_trip_id INT, p_new_trip_id INT)
     238AS $$
     239BEGIN
     240    UPDATE Ticket
     241    SET "Train Triptrip_id" = p_new_trip_id,
     242        ticket_status = 'Reassigned'
     243    WHERE "Train Triptrip_id" = p_cancelled_trip_id;
     244
     245    UPDATE "Train Trip"
     246    SET trip_status = 'Cancelled'
     247    WHERE trip_id = p_cancelled_trip_id;
     248
     249    RAISE NOTICE 'All passengers from % have been transferred to trip %.', p_cancelled_trip_id, p_new_trip_id;
     250END;
     251$$ LANGUAGE plpgsql;
     252
     253SELECT ticket_id, "Train Triptrip_id", ticket_status
     254FROM Ticket
     255WHERE "Train Triptrip_id" = 380477;
     256
     257SELECT ticket_id, "Train Triptrip_id", ticket_status
     258FROM Ticket
     259WHERE "Train Triptrip_id" = 200;
     260
     261CALL reassign_passengers_to_new_trip(380477, 200);
     262}}}
    197263Оваа процедура ги префрла сите патници од едно откажано патување на ново патување. Кога ќе се повика, ги ажурира билетите да покажуваат нов "Train Trip", им го менува статусот во "Reassigned", а старото патување го означува како "Cancelled". Се користи за брзо пренасочување на патници при откажани или променети возни линии.
    198264
    199265=== Процедура 6 : transfer_employee
    200266
    201 [[Image("Screenshot 2026-05-20 163229.png", 300px)]]
    202 
     267{{{
     268#!sql
     269CREATE OR REPLACE PROCEDURE transfer_employee(
     270    p_embg CHAR(13),
     271    p_new_company_id INT
     272)
     273AS $$
     274BEGIN
     275    IF NOT EXISTS (SELECT 1 FROM Company WHERE company_id = p_new_company_id) THEN
     276        RAISE EXCEPTION 'Company ID % does not exist.', p_new_company_id;
     277    END IF;
     278
     279    UPDATE Employee
     280    SET Companycompany_id = p_new_company_id
     281    WHERE PersonEMBG = p_embg;
     282
     283    RAISE NOTICE 'Employee with EMBG % has been successfully transferred to company %.', p_embg, p_new_company_id;
     284END;
     285$$ LANGUAGE plpgsql;
     286
     287CALL transfer_employee('2005992333958', 4);
     288
     289select * from employee where PersonEMBG='2005992333958'
     290}}}
    203291Оваа процедура го префрла вработениот во друга компанија. Прво проверува дали новата компанија постои, а потоа го ажурира записот во Employee табелата. Се користи за управување со вработени и нивно преместување меѓу компании без грешки и неконзистентни податоци.
    204292
    205293=== Процедура 7 : assign_platform_to_trip
    206294
    207 [[Image("Screenshot 2026-05-20 163515.png", 300px)]]
    208 
     295{{{
     296#!sql
     297CREATE OR REPLACE PROCEDURE assign_platform_to_trip(
     298    p_trip_id INT,
     299    p_platform_id INT,
     300    p_station_id INT
     301)
     302AS $$
     303BEGIN
     304    UPDATE "Train Trip"
     305    SET Platformplatform_id = p_platform_id,
     306        PlatformStationstation_id = p_station_id
     307    WHERE trip_id = p_trip_id;
     308
     309    IF NOT FOUND THEN
     310        RAISE EXCEPTION 'Trip with ID % not found.', p_trip_id;
     311    END IF;
     312
     313    RAISE NOTICE 'Platform % assigned to trip %.',
     314                 p_platform_id, p_trip_id;
     315END;
     316$$ LANGUAGE plpgsql;
     317CALL assign_platform_to_trip(3300, 3, 1084);
     318}}}
    209319Оваа процедура доделува платформа и станица на одредено патување. Кога ќе се повика, го ажурира Train Trip со нова платформа и станица, а ако патувањето не постои, фрла грешка. Се користи за прецизно распоредување на возовите на соодветни платформи во станиците.
    210320
    211321=== Процедура 8 : change_trip_platform
    212322
    213 [[Image("Screenshot 2026-05-20 164529.png", 300px)]]
    214 
     323{{{
     324#!sql
     325CREATE OR REPLACE PROCEDURE change_trip_platform(
     326    p_trip_id INT,
     327    p_new_platform_id INT
     328)
     329AS $$
     330BEGIN
     331    UPDATE "Train Trip"
     332    SET Platformplatform_id = p_new_platform_id
     333    WHERE trip_id = p_trip_id;
     334
     335    RAISE NOTICE 'Trip % has been transferred to platform %.', p_trip_id, p_new_platform_id;
     336END;
     337$$ LANGUAGE plpgsql;
     338
     339
     340CALL change_trip_platform(3300, 2);
     341
     342select * from "Train Trip" where trip_id=3300
     343}}}
    215344Оваа процедура ја менува платформата на одредено патување. Кога ќе се повика, го ажурира записот во Train Trip и го поставува новиот Platformplatform_id за дадениот trip_id. Се користи за динамично менување на платформите според оперативните потреби на станицата.
    216345