Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多变量mysql在过程中调用过程_Mysql_Procedure - Fatal编程技术网

使用多变量mysql在过程中调用过程

使用多变量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

我已经编写了一个很长的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
    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,可以做什么这种情况可能发生。