我写的存储过程有问题。该过程假设从具有纬度和经度的表中检索结果集,然后使用游标循环结果并更新第二个表。麻烦的是纬度和经度保持为零并且不进行更新。在独立运行raw_data查询时,它会给出具有有效纬度和经度的预期结果,但过程将看不到它们。很奇怪的是,fetch正确地看到了zip变量。
变量的数据类型与所涉及的两个表中的数据类型相同。
虽然我知道sql在使用存储过程时我很绿。任何提示都将不胜感激。
DELIMITER $$
CREATE PROCEDURE `updateLatLong` (state varchar(2))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE latitude DECIMAL(9,6) DEFAULT 0;
DECLARE longitude DECIMAL(9,6) DEFAULT 0;
DECLARE zip CHAR(5) DEFAULT '00000';
DECLARE raw_data CURSOR FOR
SELECT SQL_NO_CACHE `Latitude`, `Longitude`, `ZIPCode`
FROM `zip5`
WHERE `StateAbbr`=state
ORDER BY ZIPCode ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN raw_data;
read_loop: LOOP
FETCH FROM raw_data INTO latitude, longitude, zip;
/*SELECT state, zip, latitude, longitude;*/
IF done THEN
LEAVE read_loop;
END IF;
UPDATE `locations` SET `Latitude`=latitude, `Longitude`=longitude WHERE `StateAbbr`=state AND `ZIPCode`=zip;
END LOOP;
CLOSE raw_data;
END$$
DELIMITER ;
答案 0 :(得分:0)
好的,这是mySQL中的一个错误。 这花了我一整天的工作。
基本上,您不允许使用相同的名称作为变量的列,即使大小写也不同。所以,而不是
DECLARE latitude DECIMAL(9,6) DEFAULT 0;
你应该
DECLARE var_latitude DECIMAL(9,6) DEFAULT 0;
很好地完成了Oracle,这是一个非常老的错误,我从2007年的错误报告中得到了这个。如果他们懒得吐出一些警告,我不介意。
希望这会在他们发现类似情况时帮助他人。