MYSQL游标无休止地运行

时间:2017-03-22 17:17:05

标签: php mysql cursor

好吧,首先是免责声明:我知道使用游标是数据库编程最糟糕的做法之一,但我没有找到任何其他方法来做到这一点。

我正在创建一个博客/聊天应用程序,以便我们的员工可以与客户进行通信,并保存所有公司/客户端交互并加上时间戳(已经有一些响应时间投诉)。

无论如何,我正在努力跟踪未读消息,所以我想我可以做一个简单的数学运算,如果我知道为每个用户读取了哪些消息,那么每当我的应用程序调用消息表中的消息时,它将更新一个名为" Read messages"我将跟踪哪些消息已被阅读。

我认为我有逻辑,但每当我尝试运行它时,mysql只会挂起思考,直到它超时,但是,如果我检查“'消息”表,信息确实更新了。

以下是代码:

BEGIN 

DROP TEMPORARY TABLE IF EXISTS fetchedMessages;
CREATE TEMPORARY TABLE fetchedMessages AS (

SELECT 

blg.pkIdEntrada AS idMensaje,
blg.grlContenido AS Contenido,
blg.grlTimestamp AS FechaHora,
blg.grlReferencia AS Referencia,
usu.pkIdUsuario AS IdUsuario,
usu.gPrimerNombre AS PrimerNombre,
usu.gPrimerApellido AS PrimerApellido,
tml.pkIdRead AS idLectura


FROM blgEntries blg

LEFT JOIN tbl_usuarios      usu ON blg.fkIdUsuario = usu.pkIdUsuario
LEFT JOIN tbl_mensajesLeidos    tml ON blg.pkIdEntrada = tml.fkIdMensaje AND blg.fkIdUsuario = tml.fkIdUser

WHERE 

blg.grlReferencia = numReferencia

ORDER BY 
FechaHora DESC
);
    BEGIN
        DECLARE done INT DEFAULT FALSE;
        DECLARE c_idMess INT;
        DECLARE curs CURSOR 
            FOR SELECT idMensaje FROM fetchedMessages WHERE idLectura IS NULL AND idMensaje IS NOT NULL;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;


        OPEN curs;
            LOOP 
                FETCH curs INTO c_idMess;
                INSERT INTO tbl_mensajesLeidos (fkIdMensaje, fkIdUser) VALUES (c_idMess, idEmp) ON DUPLICATE KEY UPDATE fkIdMensaje = c_IdMess, fkIdUser = idEmp; 
                ##SELECT CONCAT(c_idMess, ' - ', idEmp);
            END LOOP;

        CLOSE curs;
    END;

SELECT * FROM fetchedMessages;

END

任何想法??

2 个答案:

答案 0 :(得分:1)

我看到与MySql游标和循环相关的大多数示例都显式检查循环中找到的变量的真实条件,在您的情况下为1,如果为true则退出循环。你似乎错过了这一步。

我也很好奇为什么如果您将已发现的变量声明为整数,则会将其默认为false而不是0。

答案 1 :(得分:0)

您没有来自LOOP的退出

查看LOOK语法示例。 这是cursor的示例。

另一个重要的:尝试使用一个简单的INSERT ... SELECT语句而不是游标。此语句允许从另一个数据集插入数据。它还将完全简化您的代码。