MySQL:在另一个表中的每一行调用游标过程

时间:2018-01-26 23:56:33

标签: mysql stored-procedures cursor

注意:我已在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();

现在,代码编译,但结果表在我调用时没有显示任何内容。我错过了什么?

1 个答案:

答案 0 :(得分:0)

问题是您的过程变量与表列的名称相同。在过程的范围内,这些名称是指变量,而不是列。所以当你写:

SELECT ID, Location, ...

它返回变量的值,而不是表格列。

有两种方法可以解决这个问题:

  1. 使用与表列不冲突的名称,例如

    DECLARE v_ID VARCHAR(5);
    DECLARE v_Location VARCHAR(255);
    ...
    
  2. 请参阅带有显式表前缀的表列:

    SELECT LocationDirectory.ID, LocationDirectory.Location, ...
    
  3. 在后一种情况下,分配表别名可能会有所帮助。