Вопрос

Попытка перехода с 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 они имеют область действия сеанса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top