MySQL 程序 Returns 0 行
MySQL Procedure Returns 0 Rows
我有一个 MySQL 脚本(使用 Workbench),用于识别位置与一组坐标对的距离。返回一定半径内的那些位置,并对这些行进行大量计算。
问题是,当我 运行 查询使用变量但不是在过程中时,脚本按我预期的方式工作。当我把它变成一个存储过程时,我放入任何行的 lat/long 变量都没有关系。但是,没有抛出任何错误。
我已经选择了我在过程中输入的 lat/long 变量,它们看起来符合预期,即它们具有正确的小数位数。
如果有人能看一看并指教,将不胜感激。谢谢!
两个脚本如下所示。
/*Code run outside of procedure:*/
Set @Radius = 200,
@Latitude = 40.76,
@Longitude = -73.97;
Select
*
From
(
Select
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible,
sum(b.TIV) TIV,
case
when sum(b.TIV) - (b.Excess + b.Deductible) >= b.Limit then (b.Limit * b.Line)
when sum(b.TIV) - (b.Excess + b.Deductible) < b.Limit and sum(b.TIV) - (b.Excess + b.Deductible) > 0 then (sum(b.TIV) - (b.Excess + b.Deductible)) * b.Line
when sum(b.TIV) - (b.Excess + b.Deductible) <= 0 then 0 end Exposure$
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV,
case when cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude)) > 1
then sign(cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude)))
else (6378100 * acos(cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude))))
end Distance
From
Location l
inner join Account a on a.ID = l.ID
)a
Where
a.Distance <= @Radius
)b
Group by
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible
)c
Where
c.Exposure$ > 0
/*Stored procedure (returning 0 rows):*/
Delimiter //
Create Procedure sp_RingAccounts (in Radius int, in Latitude decimal(9,6), in Longitude decimal(9,6))
Begin
Select Latitude;
Select Longitude;
Select Radius;
Select
*
From
(
Select
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible,
sum(b.TIV) TIV,
case
when sum(b.TIV) - (b.Excess + b.Deductible) >= b.Limit then (b.Limit * b.Line)
when sum(b.TIV) - (b.Excess + b.Deductible) < b.Limit and sum(b.TIV) - (b.Excess + b.Deductible) > 0 then (sum(b.TIV) - (b.Excess + b.Deductible)) * b.Line
when sum(b.TIV) - (b.Excess + b.Deductible) <= 0 then 0 end Exposure$
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV,
case when cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude)) > 1
then sign(cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude)))
else (6378100 * acos(cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude))))
end Distance
From
Location l
inner join Account a on a.ID = l.ID
)a
Where
a.Distance <= @Radius
)b
Group by
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible
)c
Where
c.Exposure$ > 0 ;
End ;
//
Delimiter ;
所以我找到了问题所在,我在程序主体中的变量前面使用了 @,而我不需要这样做。
所以当我只需要使用 'Latitude' 时,我就放了 @Latitude。可能应该早点发现这一点。我认为这样做并没有给我一个错误,这让我失望了,而且我对使用 SSMS 的了解也有偏见,这让我把 @ 放在变量前面。
工作脚本现在看起来像:
Delimiter //
Create Procedure sp_RingAccounts (in Radius int, in Latitude decimal(9,6), in Longitude decimal(9,6))
Begin
Select
*
From
(
Select
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible,
sum(b.TIV) TIV,
case
when sum(b.TIV) - (b.Excess + b.Deductible) >= b.Limit then (b.Limit * b.Line)
when sum(b.TIV) - (b.Excess + b.Deductible) < b.Limit and sum(b.TIV) - (b.Excess + b.Deductible) > 0 then (sum(b.TIV) - (b.Excess + b.Deductible)) * b.Line
when sum(b.TIV) - (b.Excess + b.Deductible) <= 0 then 0 end Exposure$
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV,
case when cos(radians(l.Latitude))*cos(radians(Latitude))* cos(radians(Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(Latitude)) > 1
then sign(cos(radians(l.Latitude))*cos(radians(Latitude))* cos(radians(Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(Latitude)))
else (6378100 * acos(cos(radians(l.Latitude))*cos(radians(Latitude))* cos(radians(Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(Latitude))))
end Distance
From
Location l
inner join Account a on a.ID = l.ID
)a
Where
a.Distance <= Radius
)b
Group by
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible
)c
Where
c.Exposure$ > 0 ;
End ;
//
Delimiter ;
谢谢,
乔登
我有一个 MySQL 脚本(使用 Workbench),用于识别位置与一组坐标对的距离。返回一定半径内的那些位置,并对这些行进行大量计算。
问题是,当我 运行 查询使用变量但不是在过程中时,脚本按我预期的方式工作。当我把它变成一个存储过程时,我放入任何行的 lat/long 变量都没有关系。但是,没有抛出任何错误。
我已经选择了我在过程中输入的 lat/long 变量,它们看起来符合预期,即它们具有正确的小数位数。
如果有人能看一看并指教,将不胜感激。谢谢!
两个脚本如下所示。
/*Code run outside of procedure:*/
Set @Radius = 200,
@Latitude = 40.76,
@Longitude = -73.97;
Select
*
From
(
Select
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible,
sum(b.TIV) TIV,
case
when sum(b.TIV) - (b.Excess + b.Deductible) >= b.Limit then (b.Limit * b.Line)
when sum(b.TIV) - (b.Excess + b.Deductible) < b.Limit and sum(b.TIV) - (b.Excess + b.Deductible) > 0 then (sum(b.TIV) - (b.Excess + b.Deductible)) * b.Line
when sum(b.TIV) - (b.Excess + b.Deductible) <= 0 then 0 end Exposure$
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV,
case when cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude)) > 1
then sign(cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude)))
else (6378100 * acos(cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude))))
end Distance
From
Location l
inner join Account a on a.ID = l.ID
)a
Where
a.Distance <= @Radius
)b
Group by
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible
)c
Where
c.Exposure$ > 0
/*Stored procedure (returning 0 rows):*/
Delimiter //
Create Procedure sp_RingAccounts (in Radius int, in Latitude decimal(9,6), in Longitude decimal(9,6))
Begin
Select Latitude;
Select Longitude;
Select Radius;
Select
*
From
(
Select
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible,
sum(b.TIV) TIV,
case
when sum(b.TIV) - (b.Excess + b.Deductible) >= b.Limit then (b.Limit * b.Line)
when sum(b.TIV) - (b.Excess + b.Deductible) < b.Limit and sum(b.TIV) - (b.Excess + b.Deductible) > 0 then (sum(b.TIV) - (b.Excess + b.Deductible)) * b.Line
when sum(b.TIV) - (b.Excess + b.Deductible) <= 0 then 0 end Exposure$
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV,
case when cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude)) > 1
then sign(cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude)))
else (6378100 * acos(cos(radians(l.Latitude))*cos(radians(@Latitude))* cos(radians(@Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(@Latitude))))
end Distance
From
Location l
inner join Account a on a.ID = l.ID
)a
Where
a.Distance <= @Radius
)b
Group by
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible
)c
Where
c.Exposure$ > 0 ;
End ;
//
Delimiter ;
所以我找到了问题所在,我在程序主体中的变量前面使用了 @,而我不需要这样做。
所以当我只需要使用 'Latitude' 时,我就放了 @Latitude。可能应该早点发现这一点。我认为这样做并没有给我一个错误,这让我失望了,而且我对使用 SSMS 的了解也有偏见,这让我把 @ 放在变量前面。
工作脚本现在看起来像:
Delimiter //
Create Procedure sp_RingAccounts (in Radius int, in Latitude decimal(9,6), in Longitude decimal(9,6))
Begin
Select
*
From
(
Select
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible,
sum(b.TIV) TIV,
case
when sum(b.TIV) - (b.Excess + b.Deductible) >= b.Limit then (b.Limit * b.Line)
when sum(b.TIV) - (b.Excess + b.Deductible) < b.Limit and sum(b.TIV) - (b.Excess + b.Deductible) > 0 then (sum(b.TIV) - (b.Excess + b.Deductible)) * b.Line
when sum(b.TIV) - (b.Excess + b.Deductible) <= 0 then 0 end Exposure$
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV
From
(
Select
a.ID,
a.ContractID,
a.InsuredName,
a.UserDefined1,
a.Line,
a.Limit,
a.Excess,
a.Deductible,
TIV,
case when cos(radians(l.Latitude))*cos(radians(Latitude))* cos(radians(Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(Latitude)) > 1
then sign(cos(radians(l.Latitude))*cos(radians(Latitude))* cos(radians(Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(Latitude)))
else (6378100 * acos(cos(radians(l.Latitude))*cos(radians(Latitude))* cos(radians(Longitude)- radians(l.Longitude))+ sin(radians(l.Latitude))* sin(radians(Latitude))))
end Distance
From
Location l
inner join Account a on a.ID = l.ID
)a
Where
a.Distance <= Radius
)b
Group by
b.ID,
b.ContractID,
b.InsuredName,
b.UserDefined1,
b.Line,
b.Limit,
b.Excess,
b.Deductible
)c
Where
c.Exposure$ > 0 ;
End ;
//
Delimiter ;
谢谢, 乔登