Помогите мне с этим кодом курсора MySql - PullRequest
1 голос
/ 16 июня 2009

Попытка перехода с MSSQL на MySQL.Этот сохраненный процесс создает временную таблицу для некоторых столбцов из постоянной таблицы, а затем с помощью курсора обновляет столбец RandNum каждой записи случайным числом и выбирает набор данных.Когда я писал это, я думал, что могу обойти курсор и просто ...

SELECT Id, Title, DateStart, Rand() FROM cms_News;

Но я не хочу ничего менять слишком радикально, потому что сейчас я просто пытаюсь конвертировать БД,Я вернусь и оптимизирую этот материал позже.Вот SP: EDIT: Я удалил весь код из этого примера, который не имеет ничего общего с ошибкой.Кроме того, сегодня я видел это онлайн, и кажется, что я не единственный, у кого возникла эта проблема.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;//

1 Ответ

0 голосов
/ 16 июня 2009
  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 они имеют область действия сеанса.

...