Помогите мне с этим кодом курсора MySql
-
05-07-2019 - |
Вопрос
Попытка перехода с MSSQL на MySQL. Этот сохраненный процесс создает временную таблицу для некоторых столбцов из постоянной таблицы, а затем с помощью курсора обновляет столбец RandNum каждой записи случайным числом и выбирает набор данных. Когда я писал это, я думал, что смог бы обойти курсор и просто ...
SELECT Id, Title, DateStart, Rand() FROM cms_News;
Но я не хочу ничего менять слишком радикально, потому что сейчас я просто пытаюсь конвертировать БД. Я вернусь и оптимизирую этот материал позже. Вот SP: РЕДАКТИРОВАТЬ: я удалил весь код из этого примера, который не имеет ничего общего с ошибкой. Кроме того, я сегодня этот был онлайн, и мне кажется, что я не единственный, кто имеет эту проблему. MySQL не нравится синтаксис моего объявления курсора. Есть идеи?
DELIMITER ;//
DROP PROCEDURE IF EXISTS `cms_NewsSelectMainPageNews`;//
CREATE PROCEDURE `cms_NewsSelectMainPageNews`
()
BEGIN
CREATE TEMPORARY TABLE tempNews
(
Id int NOT NULL,
Title nvarchar(250),
DateStart datetime,
RandNum float NULL
);
DECLARE Randomizer CURSOR
FOR SELECT Id FROM tempNews;
END;//
Решение
REPEAT
FETCH Randomizer INTO cursor_id;
IF NOT done THEN
UPDATE tempNews SET RandNum = rand();
WHERE id = @cursor_id;
END IF;
UNTIL done END REPEAT;
Вместо объявленной процедурой переменной cursor_id
@cursor_id
.
Перепишите следующим образом:
REPEAT
FETCH Randomizer INTO cursor_id;
IF NOT done THEN
UPDATE tempNews SET RandNum = rand();
WHERE id = cursor_id;
END IF;
UNTIL done END REPEAT;
или, что еще лучше, просто избавьтесь от своего временного стола, как вы и предлагали.
<Ч>Что касается этого утверждения:
Но я не хочу ничего менять слишком радикально, потому что сейчас я просто пытаюсь конвертировать БД. Я вернусь и оптимизирую этот материал позже.
SQL Server
и MySQL
являются чрезвычайно разными платформами.
Вы уже изменили все слишком радикально, когда решили переключиться.
В большинстве случаев вы не можете просто скопировать старый код и вбить его в MySQL
.
Возможно, он будет работать между несколькими версиями SQL Server
, поскольку, по крайней мере, предпринимаются попытки поддерживать некоторую совместимость между версиями одной и той же платформы, но это определенно не будет работать для переноса на <код> MySQL код>.
Я бы взял все фрагменты вашего кода и убедился, что он выдает те же результаты , что и старый код, используя методы как можно более простыми и предсказуемыми . р>
В вашем случае переменная @cursor_id
может быть инициализирована ранее в коде, и ее значение может использоваться хранимой процедурой, что приведет к неожиданному поведению любого типа.
Это связано с тем, что в SQL Server
переменные имеют область действия пакета, а в MySQL
они имеют область действия сеанса.