MYSQL Курсор работает бесконечно

Хорошо, прежде всего, отказ от ответственности: я знаю, что использование курсоров — это одна из худших практик программирования баз данных, но я не нашел другого способа сделать это.

Я создаю приложение, похожее на блог / чат, чтобы наши сотрудники могли общаться с клиентом, а все взаимодействия между компанией и клиентом были сохранены и помечены как временные (были жалобы на время отклика).

В любом случае, я изо всех сил пытаюсь отследить непрочитанные сообщения, поэтому я решил, что мог бы сделать простую математику, если бы знал, какие сообщения были прочитаны для каждого пользователя, поэтому всякий раз, когда мое приложение вызывает таблицу сообщений для сообщений, оно будет обновляться. отдельная таблица под названием «Чтение сообщений», где я буду отслеживать, какие сообщения были прочитаны.

Я думаю, что у меня есть логика, но всякий раз, когда я пытаюсь запустить его, mysql просто зависает, думая, пока не истечет время, однако, если я проверю таблицу ‘messages read’, информация действительно обновится.

Вот код:

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 idLecturaFROM 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

Есть идеи??

0

Решение

Большинство примеров, которые я вижу, относящихся к курсорам и циклам MySql, явно проверяют найденную переменную в цикле на предмет ее истинного состояния, 1 в вашем случае, и выходят из цикла, если true. Вы, кажется, пропустили этот шаг.

Мне также любопытно, почему, если вы объявляете найденную переменную как целое число, вы устанавливаете значение по умолчанию в false вместо 0.

1

Другие решения

У тебя нет выход из петли.

Посмотри на СМОТРЕТЬ пример синтаксиса.
Вот пример с курсор.


Еще один важныйпопробуйте использовать один простой ВСТАВИТЬ … ВЫБРАТЬ оператор вместо курсора. Этот оператор позволяет вставлять данные из другого набора данных. Это также упростит ваш код полностью.

0