2009-06-16 5 views
1

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

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

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

ответ

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; 

Вы используете инициализирован переменный сеанс @cursor_id вместо процедуры объявленных переменного cursor_id

Rewrite следующим образом:

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 у них есть область сеанса.

+0

Это не то, что нарушает его, хотя это вызывает другой вопрос, на который вы можете ответить, если хотите: http: // stackoverflow.ком/вопросы/1009954/MySQL переменной-против-переменной Что-разностной – DJTripleThreat

 Смежные вопросы

  • Нет связанных вопросов^_^