Changes between Version 55 and Version 56 of DatabaseProgramming


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

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v55 v56  
    1717[[Image("Screenshot 2026-05-20 160911.png", 300px)]]
    1818
     19```sql
     20CREATE OR REPLACE PROCEDURE pr_sell_ticket(
     213           IN p_passenger_embg CHAR(13),
     224           IN p_passenger_id INT4,
     235           IN p_trip_id INT4,
     246           IN p_start_station_id INT4,
     257           IN p_end_station_id INT4,
     268           IN p_seat_number INT4,
     279           IN p_carriage_number INT4,
     2810          IN p_price NUMERIC(2, 0),
     2911          IN p_payment_method VARCHAR(20),
     3012          OUT o_ticket_id INT4,
     3113          OUT o_payment_id INT4,
     3214          IN p_reservation_id INT4 DEFAULT NULL
     3315      )
     3416      LANGUAGE plpgsql
     3517      AS $$
     3618      DECLARE
     3719          v_passenger_exists INT;
     3820          v_trip_exists INT;
     3921          v_station_start_exists INT;
     4022          v_station_end_exists INT;
     4123          v_seat_taken INT;
     4224      BEGIN
     4325          SELECT COUNT(*) INTO v_passenger_exists
     4426          FROM Passenger
     4527          WHERE PersonEMBG = p_passenger_embg AND passenger_id = p_passenger_id;
     4628     
     4729          IF v_passenger_exists = 0 THEN
     4830              RAISE EXCEPTION 'Passenger with EMBG % and ID % does not exist.', p_passenger_embg, p_passenger_id;
     4931          END IF;
     5032     
     5133          SELECT COUNT(*) INTO v_trip_exists FROM "Train Trip" WHERE trip_id = p_trip_id;
     5234          IF v_trip_exists = 0 THEN
     5335              RAISE EXCEPTION 'Train Trip ID % does not exist.', p_trip_id;
     5436          END IF;
     5537     
     5638          SELECT COUNT(*) INTO v_station_start_exists FROM Station WHERE station_id = p_start_station_id;
     5739          SELECT COUNT(*) INTO v_station_end_exists FROM Station WHERE station_id = p_end_station_id;
     5840          IF v_station_start_exists = 0 OR v_station_end_exists = 0 THEN
     5941              RAISE EXCEPTION 'Invalid origin or destination station provided.';
     6042          END IF;
     6143     
     6244          SELECT COUNT(*) INTO v_seat_taken
     6345          FROM Ticket
     6446          WHERE "Train Triptrip_id" = p_trip_id
     6547            AND carriage_number = p_carriage_number
     6648            AND seat_number = p_seat_number
     6749            AND ticket_status = 'Active';
     6850     
     6951          IF v_seat_taken > 0 THEN
     7052              RAISE EXCEPTION 'Seat % in Carriage % is already booked for Trip %.', p_seat_number, p_carriage_number, p_trip_id;
     7153          END IF;
     7254     
     7355          IF p_reservation_id IS NOT NULL THEN
     7456              UPDATE Reservation
     7557              SET status = 'Completed'
     7658              WHERE reservation_id = p_reservation_id;
     7759          END IF;
     7860     
     7961          INSERT INTO Payment (
     8062              payment_method,
     8163              amount,
     8264              transaction_date,
     8365              Reservationreservation_id,
     8466              Passengerpassenger_id,
     8567              PassengerPersonEMBG2
     8668          )
     8769          VALUES (
     8870              p_payment_method,
     8971              p_price,
     9072              CURRENT_DATE,
     9173              p_reservation_id,
     9274              p_passenger_id,
     9375              p_passenger_embg
     9476          )
     9577          RETURNING payment_id INTO o_payment_id;
     9678     
     9779          INSERT INTO Ticket (
     9880              seat_number,
     9981              carriage_number,
     10082              price,
     10183              ticket_status,
     10284              Paymentpayment_id,
     10385              "Train Triptrip_id",
     10486              Stationstation_id,
     10587              Stationstation_id2
     10688          )
     10789          VALUES (
     10890              p_seat_number,
     10991              p_carriage_number,
     11092              p_price,
     11193              'Active',
     11294              o_payment_id,
     11395              p_trip_id,
     11496              p_start_station_id,
     11597              p_end_station_id
     11698          )
     11799          RETURNING ticket_id INTO o_ticket_id;
     118100     
     119101     EXCEPTION
     120102         WHEN OTHERS THEN
     121103             RAISE NOTICE 'Transaction rolled back due to error: %', SQLERRM;
     122104             RAISE;
     123105     END;
     124106     $$;
     125107     
     126108     
     127109     DO $$
     128110     DECLARE
     129111         v_ticket_output INT4;
     130112         v_payment_output INT4;
     131113     BEGIN
     132114         CALL pr_sell_ticket(
     133115             p_passenger_embg   => '2510985918703',
     134116             p_passenger_id     => 290,
     135117             p_trip_id          => 4,
     136118             p_start_station_id => 10,
     137119             p_end_station_id   => 14,
     138120             p_seat_number      => 22,
     139121             p_carriage_number  => 2,
     140122             p_price            => 45,
     141123             p_payment_method   => 'Apple Pay',
     142124             o_ticket_id        => v_ticket_output,
     143125             o_payment_id       => v_payment_output,
     144126             p_reservation_id   => NULL
     145127         );
     146128     
     147129         RAISE NOTICE 'Sale Complete! Ticket ID: %, Payment ID: %', v_ticket_output, v_payment_output;
     148130     END $$;
     149131     
     150132     select * from ticket where ticket_id='23989062';
     151
    19152Оваа процедура автоматски продава билет во системот за возови. Прво проверува дали постојат патникот, патувањето и станиците, и дали седиштето е слободно. Потоа креира плаќање и билет и ако постои резервација ја означува како "Completed". Се користи за автоматизирана и сигурна продажба на билети без грешки и дупли резервации.
    20153