Вызов процедуры внутри процедуры с несколькими переменными mysql - PullRequest
0 голосов
/ 28 февраля 2020

Я написал длинный запрос MySQK, который хочу использовать в другом запросе. Я борюсь с частью подключения переменных из первой процедуры в течение второй.

CREATE PROCEDURE proc1(lat double,lon double) BEGIN
    SELECT * FROM Locations where latitude=lat AND longitude=lon;
END;

, которая возвращает идентификатор и имя

CREATE PROCEDURE call_procedure(lat double,lon double)
BEGIN
    SELECT * FROM Weather WHERE procId=call proc1(lat,lon);
END;

Какой шаг мне не хватает, чтобы получить идентификатор значение на месте вызова proc1 (широта, долгота). Я пытался объявить переменную, но мне это не удалось.

ОБНОВЛЕНИЕ: Я пытался редактировать свой код в соответствии с @ Akina

CREATE PROCEDURE nearest_weather_station16(IN lat double,IN lon double, OUT station INT, OUT station_name VARCHAR(30), OUT distance DOUBLE)
BEGIN
   Select WeatherStations.weatherStationIndex INTO station, WeatherStations.stationName INTO station_name, (6371 * acos(cos(radians(lat)) * 
   cos(radians(Locations.latitude)) * 
   cos(radians(Locations.longitude) - 
   radians(lon)) + 
   sin(radians(lat)) * 
   sin(radians(Locations.latitude)))) as dis INTO distance
        FROM 
        (
        SELECT weatherStationIndex,weatherIndex, MAX(TIME) AS LASTSEEN
        FROM Weather where time>DATE_SUB(UTC_TIMESTAMP(),INTERVAL 1 hour)
        GROUP BY weatherStationIndex
        ) latest
        JOIN WeatherStations ON latest.weatherStationIndex=WeatherStations.weatherStationIndex JOIN Locations on WeatherStations.locationIndex=Locations.locationIndex
        ORDER BY dis ASC LIMIT 1;
END;

Код работал до добавления слова IN и OUT, включая переменные и INTO, включая переменные. Теперь выдает ошибку необъявленной переменной: WeatherStations

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Вы должны были реализовать proc1 как FUNCTION, потому что вас интересует идентификатор, а координата однозначно указывает местоположение:

CREATE FUNCTION proc1(lat double,lon double) RETURNS INT
BEGIN
    DECLARE result INT DEFAULT NULL;
    SELECT id into result FROM Locations where latitude=lat AND longitude=lon;
    RETURN result;
END;

и используйте его следующим образом:

CREATE PROCEDURE call_procedure(lat double,lon double)
BEGIN
    SELECT * FROM Weather WHERE procId=proc1(lat,lon);
END;

Или, если у вас могут быть повторяющиеся данные, вы можете использовать курсор, но в этом случае не делайте этого.

0 голосов
/ 28 февраля 2020

Кажется, вам нужно

CREATE PROCEDURE slave (IN lat double, IN lon double, OUT var_procId BIGINT)
BEGIN
    SELECT id INTO var_procId FROM Locations WHERE latitude=lat AND longitude=lon LIMIT 1;
END;
CREATE PROCEDURE parent(lat double,lon double)
BEGIN
    DECLARE var_procId BIGINT;
    CALL slave(lat, lon, var_procId )
    SELECT * FROM Weather WHERE procId=var_procId ;
END;
...