我有一个存储过程:
DROP PROCEDURE `getCercanoRadio`//
CREATE DEFINER=`prog2sc`@`localhost`
PROCEDURE `getCercanoRadio`
(IN latitude Double, IN longitude Double, IN tipo_servicio INT)
BEGIN
SET @LAT = latitude;
SET @LON = longitude;
SET @Servicio = tipo_servicio;
SET @point = CONCAT('POINT(',@LAT,' ',@LON,')');
SET @center = GeomFromText(@point);
SET @radius = 0.01;
SET @bbox = CONCAT('POLYGON((',
X(@center) - @radius, ' ', Y(@center) - @radius, ',',
X(@center) + @radius, ' ', Y(@center) - @radius, ',',
X(@center) + @radius, ' ', Y(@center) + @radius, ',',
X(@center) - @radius, ' ', Y(@center) + @radius, ',',
X(@center) - @radius, ' ', Y(@center) - @radius, '))');
SELECT
prog2sc_SCDBs.Punto_Geografico.latitude
,prog2sc_SCDBs.Punto_Geografico.longitude
, prog2sc_SCDBs.Tipo_Servicio.idTipo_Servicio
, prog2sc_SCDBs.Ubicacion.nombreUbicacion
, SQRT(POW( ABS( X(geopoint) - X(@center)), 2)
+ POW( ABS(Y(geopoint) - Y(@center)), 2 )) AS distance
FROM prog2sc_SCDBs.Ubicacion
INNER JOIN prog2sc_SCDBs.Tipo_Servicio ON
prog2sc_SCDBs.Ubicacion.Tipo_Servicio_idTipo_Servicio = idTipo_Servicio
INNER JOIN prog2sc_SCDBs.Punto_Geografico ON
prog2sc_SCDBs.Ubicacion.idUbicacion =
prog2sc_SCDBs.Punto_Geografico.idPunto_Geografico
WHERE Intersects( geopoint, GeomFromText(@bbox) )
AND idTipo_Servicio=@Servicio
AND (
SQRT(POW( ABS( X(geopoint) - X(@center)), 2)
+ POW( ABS(Y(geopoint) - Y(@center)), 2 ))
) < @radius
ORDER BY distance,geopoint;
END
我想进行条件检查,如果此商店prodedure的结果集为空,则增加@radius并再次运行,直到resulset不为空。
答案 0 :(得分:2)
为了在获得特定结果之前继续运行语句,您需要LOOP
statement。此外,您应该在语句(example here)中添加SELECT
子句,而不是仅运行INTO
,以临时存储查询结果。您需要define the variables first - 在您的情况下,变量可能是@latitude
,@longitude
等,其定义应与列中的数据类型相对应。
运行SELECT ... INTO ...
之后,您可以test the contents of the variables,如果不是您想要的,请增加@radius
并允许循环继续,否则,发出{ {1}}结束循环。
要从您的程序中返回数据,您可以使用LEAVE
参数(在CREATE PROCEDURE
manpage上说明),也可以发出另一个OUT
。
SELECT
参数将意味着将参数更改为您的过程(将OUT
类型参数添加到OUT
参数列表中),以及调用它的方式为{{1} }参数的处理方式与过程中IN
的结果不同。
使用OUT
方法,为在过程结束时定义的变量发出SELECT
。使用此方法,数据将以您现在出现的格式显示。你可以在SELECT
:
SELECT
该方法意味着不需要更改调用该过程的现有代码 - 只要您将变量别名以匹配现有查询的列名。