注意:我已在Call a stored procedure for each row returned by a query in MySQL上引用了该问题,并在其后对我的代码进行了建模。
我创建了一个名为NearbyCities的存储过程,它通过输入一个位置来调用它。现在,我有660个位置,而不是手动调用它660次,我发现我可以使用游标创建另一个程序来为我完成这项工作。因此,通过引用各种资源,我得出了以下代码:
DELIMITER //
CREATE PROCEDURE LocationCursor()
BEGIN
DECLARE `Finished` INT DEFAULT FALSE;
DECLARE `ID` VARCHAR(5);
DECLARE `Location` VARCHAR(255);
DECLARE `Street` VARCHAR(255);
DECLARE `City` VARCHAR(255);
DECLARE `State` VARCHAR(255);
DECLARE `Zip Code` VARCHAR(255);
DECLARE `Latitude` VARCHAR(255);
DECLARE `Longitude` VARCHAR(255);
DECLARE `LocCursor` CURSOR
FOR SELECT `ID`
,`Location`
,`Street`
,`City`
,`State`
,`Zip Code`
,`Latitude`
,`Longitude`
FROM `LocationDirectory`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET `Finished` = TRUE;
OPEN `LocCursor`;
ReadLoop: LOOP
FETCH NEXT FROM `LocCursor` INTO `ID`
,`Location`
,`Street`
,`City`
,`State`
,`Zip Code`
,`Latitude`
,`Longitude`;
IF `Finished` = TRUE
THEN LEAVE ReadLoop;
END IF;
CALL NearbyCities(`ID`);
END LOOP ReadLoop;
CLOSE `LocCursor`;
END //
DELIMITER ;
CALL LocationCursor();
现在,代码编译,但结果表在我调用时没有显示任何内容。我错过了什么?
答案 0 :(得分:0)
问题是您的过程变量与表列的名称相同。在过程的范围内,这些名称是指变量,而不是列。所以当你写:
SELECT ID, Location, ...
它返回变量的值,而不是表格列。
有两种方法可以解决这个问题:
使用与表列不冲突的名称,例如
DECLARE v_ID VARCHAR(5);
DECLARE v_Location VARCHAR(255);
...
请参阅带有显式表前缀的表列:
SELECT LocationDirectory.ID, LocationDirectory.Location, ...
在后一种情况下,分配表别名可能会有所帮助。