mySQL存储过程空值,但不是所有行

时间:2014-05-13 12:44:45

标签: mysql stored-procedures

我写的存储过程有问题。该过程假设从具有纬度和经度的表中检索结果集,然后使用游标循环结果并更新第二个表。麻烦的是纬度和经度保持为零并且不进行更新。在独立运行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 ;

1 个答案:

答案 0 :(得分:0)

好的,这是mySQL中的一个错误。 这花了我一整天的工作。

基本上,您不允许使用相同的名称作为变量的列,即使大小写也不同。所以,而不是

DECLARE latitude DECIMAL(9,6) DEFAULT 0;
你应该

DECLARE var_latitude DECIMAL(9,6) DEFAULT 0;

很好地完成了Oracle,这是一个非常老的错误,我从2007年的错误报告中得到了这个。如果他们懒得吐出一些警告,我不介意。

希望这会在他们发现类似情况时帮助他人。