Помогите мне с этим кодом курсора MySql

Попытка перехода из MSSQL в SELECT Id , Title , DateStart , Rand () FROM cms_News ; , Этот Stored Proc создает временную таблицу для некоторых столбцов из постоянной таблицы, а затем использует курсор для обновления столбца RandNum каждой записи со случайным числом и выбирает набор данных. Поскольку я пишу это, я думал, что могу обойти курсор и просто ...

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;//

Но я не хочу ничего менять слишком сильно, потому что сейчас я просто пытаюсь преобразовать БД. Я вернусь и оптимизирую этот материал позже. Вот SP: EDIT: я удалил весь код из этого примера, который не имеет ничего общего с ошибкой. Кроме того, я видел REPEAT FETCH Randomizer INTO cursor_id ; ЕСЛИ НЕ сделано ТОГДА UPDATE tempNews SET RandNum = rand (); WHERE id = @ cursor_id ; END IF ; UNTIL done END REPEAT ; .com / read.php? 102,238983,238983 «rel =« nofollow noreferrer »> этот онлайн сегодня, и кажется, что я не единственный, у кого есть эта проблема. @cursor_id не любит синтаксис моего курсора декларация. Любые идеи?

cursor_id

mysql,stored-procedures,cursor,fetch,

1

Ответов: 1


0 принят
  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представляют собой совершенно разные платформы.

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

В большинстве случаев вы не можете просто скопировать старый код и забить его MySQL.

Возможно, это будет работать между несколькими версиями @cursor_id, поскольку, по крайней мере, есть попытки поддерживать некоторую совместимость между версиями одной и той же платформы, но это определенно не будет работать для переноса MySQL.

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

В вашем случае SQL Serverпеременная может быть инициализирована ранее в коде, и ее значение может быть использовано хранимой процедурой, что приведет к любому неожиданному поведению.

Это связано с тем, что в MySQLпеременных есть пакетная область, в то время как в MySQLних есть область сеанса.

MySQL, хранимые-процедуры, курсор, выборки,
Похожие вопросы