| | 19 | ```sql |
| | 20 | CREATE OR REPLACE PROCEDURE pr_sell_ticket( |
| | 21 | 3 IN p_passenger_embg CHAR(13), |
| | 22 | 4 IN p_passenger_id INT4, |
| | 23 | 5 IN p_trip_id INT4, |
| | 24 | 6 IN p_start_station_id INT4, |
| | 25 | 7 IN p_end_station_id INT4, |
| | 26 | 8 IN p_seat_number INT4, |
| | 27 | 9 IN p_carriage_number INT4, |
| | 28 | 10 IN p_price NUMERIC(2, 0), |
| | 29 | 11 IN p_payment_method VARCHAR(20), |
| | 30 | 12 OUT o_ticket_id INT4, |
| | 31 | 13 OUT o_payment_id INT4, |
| | 32 | 14 IN p_reservation_id INT4 DEFAULT NULL |
| | 33 | 15 ) |
| | 34 | 16 LANGUAGE plpgsql |
| | 35 | 17 AS $$ |
| | 36 | 18 DECLARE |
| | 37 | 19 v_passenger_exists INT; |
| | 38 | 20 v_trip_exists INT; |
| | 39 | 21 v_station_start_exists INT; |
| | 40 | 22 v_station_end_exists INT; |
| | 41 | 23 v_seat_taken INT; |
| | 42 | 24 BEGIN |
| | 43 | 25 SELECT COUNT(*) INTO v_passenger_exists |
| | 44 | 26 FROM Passenger |
| | 45 | 27 WHERE PersonEMBG = p_passenger_embg AND passenger_id = p_passenger_id; |
| | 46 | 28 |
| | 47 | 29 IF v_passenger_exists = 0 THEN |
| | 48 | 30 RAISE EXCEPTION 'Passenger with EMBG % and ID % does not exist.', p_passenger_embg, p_passenger_id; |
| | 49 | 31 END IF; |
| | 50 | 32 |
| | 51 | 33 SELECT COUNT(*) INTO v_trip_exists FROM "Train Trip" WHERE trip_id = p_trip_id; |
| | 52 | 34 IF v_trip_exists = 0 THEN |
| | 53 | 35 RAISE EXCEPTION 'Train Trip ID % does not exist.', p_trip_id; |
| | 54 | 36 END IF; |
| | 55 | 37 |
| | 56 | 38 SELECT COUNT(*) INTO v_station_start_exists FROM Station WHERE station_id = p_start_station_id; |
| | 57 | 39 SELECT COUNT(*) INTO v_station_end_exists FROM Station WHERE station_id = p_end_station_id; |
| | 58 | 40 IF v_station_start_exists = 0 OR v_station_end_exists = 0 THEN |
| | 59 | 41 RAISE EXCEPTION 'Invalid origin or destination station provided.'; |
| | 60 | 42 END IF; |
| | 61 | 43 |
| | 62 | 44 SELECT COUNT(*) INTO v_seat_taken |
| | 63 | 45 FROM Ticket |
| | 64 | 46 WHERE "Train Triptrip_id" = p_trip_id |
| | 65 | 47 AND carriage_number = p_carriage_number |
| | 66 | 48 AND seat_number = p_seat_number |
| | 67 | 49 AND ticket_status = 'Active'; |
| | 68 | 50 |
| | 69 | 51 IF v_seat_taken > 0 THEN |
| | 70 | 52 RAISE EXCEPTION 'Seat % in Carriage % is already booked for Trip %.', p_seat_number, p_carriage_number, p_trip_id; |
| | 71 | 53 END IF; |
| | 72 | 54 |
| | 73 | 55 IF p_reservation_id IS NOT NULL THEN |
| | 74 | 56 UPDATE Reservation |
| | 75 | 57 SET status = 'Completed' |
| | 76 | 58 WHERE reservation_id = p_reservation_id; |
| | 77 | 59 END IF; |
| | 78 | 60 |
| | 79 | 61 INSERT INTO Payment ( |
| | 80 | 62 payment_method, |
| | 81 | 63 amount, |
| | 82 | 64 transaction_date, |
| | 83 | 65 Reservationreservation_id, |
| | 84 | 66 Passengerpassenger_id, |
| | 85 | 67 PassengerPersonEMBG2 |
| | 86 | 68 ) |
| | 87 | 69 VALUES ( |
| | 88 | 70 p_payment_method, |
| | 89 | 71 p_price, |
| | 90 | 72 CURRENT_DATE, |
| | 91 | 73 p_reservation_id, |
| | 92 | 74 p_passenger_id, |
| | 93 | 75 p_passenger_embg |
| | 94 | 76 ) |
| | 95 | 77 RETURNING payment_id INTO o_payment_id; |
| | 96 | 78 |
| | 97 | 79 INSERT INTO Ticket ( |
| | 98 | 80 seat_number, |
| | 99 | 81 carriage_number, |
| | 100 | 82 price, |
| | 101 | 83 ticket_status, |
| | 102 | 84 Paymentpayment_id, |
| | 103 | 85 "Train Triptrip_id", |
| | 104 | 86 Stationstation_id, |
| | 105 | 87 Stationstation_id2 |
| | 106 | 88 ) |
| | 107 | 89 VALUES ( |
| | 108 | 90 p_seat_number, |
| | 109 | 91 p_carriage_number, |
| | 110 | 92 p_price, |
| | 111 | 93 'Active', |
| | 112 | 94 o_payment_id, |
| | 113 | 95 p_trip_id, |
| | 114 | 96 p_start_station_id, |
| | 115 | 97 p_end_station_id |
| | 116 | 98 ) |
| | 117 | 99 RETURNING ticket_id INTO o_ticket_id; |
| | 118 | 100 |
| | 119 | 101 EXCEPTION |
| | 120 | 102 WHEN OTHERS THEN |
| | 121 | 103 RAISE NOTICE 'Transaction rolled back due to error: %', SQLERRM; |
| | 122 | 104 RAISE; |
| | 123 | 105 END; |
| | 124 | 106 $$; |
| | 125 | 107 |
| | 126 | 108 |
| | 127 | 109 DO $$ |
| | 128 | 110 DECLARE |
| | 129 | 111 v_ticket_output INT4; |
| | 130 | 112 v_payment_output INT4; |
| | 131 | 113 BEGIN |
| | 132 | 114 CALL pr_sell_ticket( |
| | 133 | 115 p_passenger_embg => '2510985918703', |
| | 134 | 116 p_passenger_id => 290, |
| | 135 | 117 p_trip_id => 4, |
| | 136 | 118 p_start_station_id => 10, |
| | 137 | 119 p_end_station_id => 14, |
| | 138 | 120 p_seat_number => 22, |
| | 139 | 121 p_carriage_number => 2, |
| | 140 | 122 p_price => 45, |
| | 141 | 123 p_payment_method => 'Apple Pay', |
| | 142 | 124 o_ticket_id => v_ticket_output, |
| | 143 | 125 o_payment_id => v_payment_output, |
| | 144 | 126 p_reservation_id => NULL |
| | 145 | 127 ); |
| | 146 | 128 |
| | 147 | 129 RAISE NOTICE 'Sale Complete! Ticket ID: %, Payment ID: %', v_ticket_output, v_payment_output; |
| | 148 | 130 END $$; |
| | 149 | 131 |
| | 150 | 132 select * from ticket where ticket_id='23989062'; |
| | 151 | |