Here is the task I am trying to accomplish:
Find the closest available vehicle for a given location.
I have a table for vehicle
and a table for location
as follows:
CREATE TABLE location
(location_id numeric(8,0) UNIQUE NOT NULL,
address varchar(100),
latitude float,
longitude float,
PRIMARY KEY(location_id)
);
CREATE TABLE vehicle
(license_plate char(6) UNIQUE NOT NULL,
make varchar(30) NOT NULL,
model varchar(30) NOT NULL,
year numeric(4,0) NOT NULL CHECK(year>1990),
state char(2) NOT NULL,
capacity int NOT NULL,
last_location numeric(8,0) DEFAULT NULL,
FOREIGN KEY(last_location) REFERENCES location(location_id) ON DELETE
CASCADE ON UPDATE CASCADE,
PRIMARY KEY(license_plate)
);
I wrote a query that calls a function to loop through the vehicle
table, calculate the distance with a given location and return the license_plate
of the car with the minimum distance.
SELECT @locationA := 11111111;
SET @loc_lat = (SELECT latitude FROM location WHERE location_id =
@locationA);
SET @loc_long = (SELECT longitude FROM location WHERE location_id =
@locationA);
SELECT license_plate, make, model FROM vehicle
WHERE license_plate = find_car(@loc_lat, @loc_long);
DELIMITER $$
CREATE FUNCTION find_car(loc_lat float, loc_long float) RETURNS char
BEGIN
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
DECLARE CUR_DIST float DEFAULT 1000000000;
DECLARE car_lat NUMERIC;
DECLARE car_long NUMERIC;
DECLARE dist float;
DECLARE closest_car char(6);
DECLARE car_temp char(6);
DECLARE loc_temp numeric;
DECLARE car_cursor CURSOR FOR SELECT license_plate, last_location FROM
vehicle;
OPEN car_cursor;
car_loop: LOOP
FETCH car_cursor INTO car_temp, loc_temp;
SET car_lat = (SELECT latitude FROM location WHERE location_id =
loc_temp);
SET car_long = (SELECT longitude FROM location WHERE location_id =
loc_temp);
SET dist = (SELECT ST_Distance_Sphere(
point(loc_lat, loc_long),
point(car_lat, car_long)
) * .000621371192);
IF dist < CUR_DIST THEN
SET closest_car = car_temp;
SET CUR_DIST = dist;
END IF;
END LOOP;
CLOSE car_cursor;
RETURN(closest_car);
END $$
DELIMITER ;
Right now, this returns nothing and I am not quite sure why. I'm still fairly new to SQL so thanks in advance!