2012-05-11 6 views
0

Я написал следующий динамический запрос в моей хранимой процедуре,MySQL динамический запрос внутри хранимой процедуры

FETCH cur1 INTO a1, ldt1, b1; 
    WHILE DONE = 0 DO 

     SET @s=CONCAT('UPDATE ',fname , ' SET connectedDateTime = ldt1,opid = b1 
     WHERE hq_conferee_seqno=a1 AND (LoggedDateTime <=ldt1 AND connectedDateTime IS NULL)'); 
     FETCH cur1 INTO a1, ldt1, b1; 
     PREPARE stmt FROM @s; 
     EXECUTE stmt; 
    END WHILE; 
    CLOSE cur1; 

Когда я компилирую хранимый я не получаю сообщение об ошибке. Но когда я запускаю этот код, я получил ошибку, например, у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «NULL» по строке 1

В чем проблема. Пожалуйста, помогите мне. Спасибо заранее.

ответ

0

Как указано в the manual:

Локальные переменные находятся в области видимости только во время выполнения программы, сохраненной. Ссылки на них не допускаются в подготовленных операциях, поскольку они являются глобальными для текущего сеанса, и переменные могут выйти из области действия при выполнении инструкции.

Вы должны вместо этого принести курсор в пользователя переменные и либо ссылаться на те из подготовленного заявления (они остаются в области видимости длительности соединения), или (еще лучше) передать их в подготовленное заявление, как параметры:

SET @s=CONCAT('UPDATE ',fname , ' SET connectedDateTime = ?,opid = ? 
WHERE hq_conferee_seqno=? AND (LoggedDateTime <=? AND connectedDateTime IS NULL)'); 
FETCH cur1 INTO @a1, @ldt1, @b1; 
PREPARE stmt FROM @s; 
EXECUTE stmt USING @ldt1, @b1, @a1, @ldt1;