我在MYSQL数据库中有以下存储过程。存储过程得到lon,lat,而不是我在不同的数据库和表上进行更新。
DROP PROCEDURE IF EXISTS annuals.updateSalesFlorida;
CREATE DEFINER=`dddd`@`%` PROCEDURE `updateSales`(propertyId int)
BEGIN
DECLARE lat FLOAT;
DECLARE lon FLOAT;
SELECT SitusLongitude,SitusLatitude
INTO lon,lat
FROM annuals.florida
WHERE PropertyID=propertyId
LIMIT 1 FOR UPDATE;
UPDATE sales.florida
SET
`SitusLongitude` = lon,
`SitusLatitude` = lat
WHERE PROPERTYUNIQUEID=propertyId;
END;
每次运行存储过程时,SitusLongitude
和SitusLatitude
列都为0.我知道上一个选定的SitusLongitude
和SitusLatitude
具有实际值那里。由于某种原因,变量没有在lat,lon中设置。知道我错了什么吗?
答案 0 :(得分:1)
问题是procedure参数与表中的列具有相同的名称。在查询中引用propertyid
时,它使用的是列,而不是参数。列和变量名称不区分大小写,因此拼写其中一个PropertyID
和另一个propertyId
并不重要。
为参数使用其他名称,例如p_propertyId
此外,不需要两个查询,您可以使用JOIN
进行查询。
UPDATE sales.florida AS s
CROSS JOIN (
SELECT *
FROM annuals.florida
WHERE propertyId = p_propertyId
LIMIT 1) AS a
SET s.SitusLongitude = a.SitusLongitude, s.SitusLatitude = a.SitusLatitude
WHERE s.PROPERTYUNIQUEID = p_propertyId
请注意,使用LIMIT
而不使用ORDER BY
意味着所选的行将无法预测。