使用多变量mysql在过程中调用过程
我已经编写了一个很长的MySQK查询,我想在另一个查询中重用它。我很难在第二个过程中连接第一个过程中的变量使用多变量mysql在过程中调用过程,mysql,procedure,Mysql,Procedure,我已经编写了一个很长的MySQK查询,我想在另一个查询中重用它。我很难在第二个过程中连接第一个过程中的变量 CREATE PROCEDURE proc1(lat double,lon double) BEGIN SELECT * FROM Locations where latitude=lat AND longitude=lon; END; 返回一个id和名称 CREATE PROCEDURE call_procedure(lat double,lon double) BEGIN
CREATE PROCEDURE proc1(lat double,lon double) BEGIN
SELECT * FROM Locations where latitude=lat AND longitude=lon;
END;
返回一个id和名称
CREATE PROCEDURE call_procedure(lat double,lon double)
BEGIN
SELECT * FROM Weather WHERE procId=call proc1(lat,lon);
END;
在调用proc1(lat,lon)的位置获取id值时,我缺少了哪一步。我试图声明一个变量,但失败了
更新:
我试图根据@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 include variables以及INTO include variables之前,代码运行良好。现在它给出了一个未声明的错误变量:WeatherStations
CREATE PROCEDURE slave(在lat-double中,在lon-double中,在var\u-procId-BIGINT中)
开始
从纬度=纬度,经度=经度限制1的位置将id选择到var_procId中;
结束;
创建过程父级(lat-double、lon-double)
开始
声明var_procId BIGINT;
调用从机(lat、lon、var_procId)
从天气中选择*,其中procId=var\u procId;
结束;
您应该将proc1
作为函数实现,因为您对id感兴趣,并且坐标唯一地指定了一个位置:
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;
或者,如果您可以有重复的数据,那么您可以使用光标,但在这种情况下不要这样做。我尝试了这种具有多个输出的解决方案,但不知何故,它不再识别原始变量。参见上面的代码。你知道为什么会出现这种情况吗?当我建议解决方案时,我试图根据@Akina编辑我的代码,但我从来没有说过应该使用大量语法错误来实现它。请参阅-只使用了一个包含CSV变量列表的INTO子句。result
变量过量-您可以立即返回查询结果(返回的数据类型是标量-因此限制1
接近强制)。当第一次实现时,则BEGIN..END
块变得多余并可能被删除。@Akina limit 1解决了可能的重复项。我在回答中假设一个位置是由坐标唯一确定的。如果此假设在op的数据库中为false,则需要使用limit 1。我还指定了如果使用duplic,可以做什么这种情况可能发生。