【问题标题】:MySQL: Calling Cursor Procedure tor Each Row in Another TableMySQL:为另一个表中的每一行调用游标过程
【发布时间】:2018-01-26 23:56:32
【问题描述】:

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

现在,代码编译了,但是当我调用它时结果表什么也没有显示。我错过了什么?

【问题讨论】:

  • 不要使用与查询中的列同名的变量。
  • 如果您更改所有变量以使其不发生冲突,是否有效?
  • 我不确定我是否理解。你是说我的游标 SELECT 语句中的变量名需要与我的 fetch 循环中的变量名不同?
  • 我是说您在顶部 DECLARE 的变量名称不应与您 SELECT 来自的表中的列名称相同。
  • 哦。让我试试看。

标签: mysql stored-procedures cursor


【解决方案1】:

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

SELECT ID, Location, ...

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

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

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

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

    SELECT LocationDirectory.ID, LocationDirectory.Location, ...
    

在后一种情况下,分配表别名可能会有所帮助。

【讨论】:

  • 好吧,我已经尝试了第一个,结果出现了未声明的变量错误。我会尝试第二个选项。
  • 使用第二种方法时,您仍然应该得到一个未知的列错误。您必须有一个列名错误,并且变量名隐藏了错误。
  • 知道了!!谢谢。
  • 所以这个程序编译了,但是当我调用它(CALL LocationCursor())时,它只返回列名。没有别的了。
  • 也许NearbyCities() 函数有问题,因为这是返回结果的那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
相关资源
最近更新 更多