MySQL存储过程,如果存储过程的Resultset为空,则更改一个变量并再次运行

时间:2011-04-22 21:53:25

标签: mysql sql stored-procedures

我有一个存储过程:

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不为空。

1 个答案:

答案 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

该方法意味着不需要更改调用该过程的现有代码 - 只要您将变量别名以匹配现有查询的列名。