Forum Discussion

Akin_890's avatar
Akin_890
Copper Contributor
Mar 07, 2023

Can someone help me fix the errors in my sql coding?

USE Optician;

 

-- Create the branches table
CREATE TABLE branches (
branch_id INT PRIMARY KEY,
branch_name VARCHAR(255),
branch_address VARCHAR(255),
technician_available BOOLEAN
);

-- Create the staff table
CREATE TABLE staff (
staff_id INT PRIMARY KEY,
staff_name VARCHAR(255),
staff_role VARCHAR(255),
branch_id INT,
);

-- Create the appointments table
CREATE TABLE appointments (
appointment_id INT PRIMARY KEY,
customer_name VARCHAR(255),
appointment_type VARCHAR(255),
appointment_date DATE,
appointment_time TIME,
staff_id INT,
);

-- Create the orders table
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_name VARCHAR(255),
order_type VARCHAR(255),
order_status VARCHAR(255),
order_date DATE,
technician_id INT,
FOREIGN KEY (technician_id) REFERENCES staff(staff_id)
);

-- Create the stored procedures
CREATE PROCEDURE sp_GetAppointments(day DATE)
BEGIN
SELECT *
FROM appointments
WHERE appointment_date = day;
END;

CREATE PROCEDURE sp_CancelAppointment(appt_id INT)
BEGIN
DELETE FROM appointments
WHERE appointment_id = appt_id;

UPDATE appointments
SET appointment_time = (
SELECT MIN(appointment_time)
FROM appointments
WHERE appointment_date =
(SELECT appointment_date
FROM appointments
WHERE appointment_id = appt_id)
AND appointment_time >
(SELECT appointment_time
FROM appointments
WHERE appointment_id = appt_id)
AND staff_id =
(SELECT staff_id
FROM appointments
WHERE appointment_id = appt_id)
)
WHERE appointment_id IN (
SELECT appointment_id
FROM appointments
WHERE appointment_date = (SELECT appointment_date FROM appointments WHERE appointment_id = appt_id)
AND appointment_time > (SELECT appointment_time FROM appointments WHERE appointment_id = appt_id)
AND staff_id = (SELECT staff_id FROM appointments WHERE appointment_id = appt_id)
ORDER BY appointment_time
LIMIT 1
);
END;

CREATE PROCEDURE sp_GetOrderStatus(order_id INT)
BEGIN
SELECT order_status
FROM orders
WHERE order_id = order_id;
END;

-- Create the triggers
CREATE TRIGGER tr_AppointmentScheduled
BEFORE INSERT ON appointments
FOR EACH ROW
BEGIN
IF NEW.staff_id IS NULL THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No technician available for this appointment';
END IF;
END;

CREATE TRIGGER tr_OrderStatusChange
BEFORE UPDATE ON orders
FOR EACH ROW
BEGIN
IF NEW.technician_id IS NULL THEN
SET NEW.order_status = 'Ordered';
ELSEIF NEW.order_status = 'Ordered' THEN
SET NEW.order_status = 'Arrived';
ELSEIF NEW.order_status = 'Arrived' THEN
SET NEW.order_status = 'Completed';
END IF;
END;

-- Create the functions
CREATE FUNCTION fn_GetAvailableStaff(branch_id INT, date DATE, time TIME)
RETURNS INT
BEGIN
DECLARE staff_id INT;

SELECT staff_id INTO staff_id
FROM staff
WHERE branch_id = branch_id
AND staff_role = 'technician'
AND staff_id NOT IN (
SELECT staff_id
FROM appointments
WHERE appointment_date = date
AND appointment_time = time
)
AND technician_available = true
LIMIT 1;

RETURN staff_id;
END;

 

 

Resources