MySQL выдает предупреждение для пользовательских переменных SET в выражениях - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть хранимая процедура, которая больше не работает в MySQL 8.0.17 из-за того, что обработчик выхода перехватил предупреждение и вышел из блока.Я предполагаю, что ошибка генерируется из-за переменной @transql, но я не уверен на 100%.Основная проблема заключается в том, что вызываемый хранимый процесс никогда не достигает его из-за выхода.

+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| @p1   | @p2                                                                                                                                                                                                                                                                                                                                                 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| HY000 | Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Я проверил несколько других вопросов, но не смог перевести их в этот запрос.

BEGIN
 DECLARE EXIT HANDLER FOR SQLEXCEPTION, sqlwarning
    BEGIN
   GET DIAGNOSTICS CONDITION 1 @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
   ROLLBACK;
   END;

  START TRANSACTION;
  SET @key1 = key1;
    SET @transkey = transkey;
    SET @transql = CONCAT('SELECT @cckey:=cckey FROM `', key1,
    '_kr` AS t1 WHERE `transkey` = ?');
    PREPARE stmt FROM @transql;
    EXECUTE stmt
    USING @transkey;
    DEALLOCATE PREPARE stmt;

    CALL sp_procedure1(key1, @cckey, @transkey)

  COMMIT;
END

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Предупреждение

Установка пользовательских переменных в выражениях устарела и будет удалена в следующем выпуске.Рассмотрим альтернативные варианты: «SET variable = expression, ...» или «SELECT expression (s) INTO variable (s)».

- почти идеальный ответ на ваш вопрос.Но чтобы помочь вам. Первое предложение неприменимо для подготовленных утверждений, поэтому вам нужно использовать второе:

SET @transql = CONCAT('SELECT cckey INTO @cckey FROM `', key1,
    '_kr` AS t1 WHERE `transkey` = ?');

См .: SELECT ... INTO Синтаксис

1 голос
/ 28 сентября 2019

Это предупреждение, а не сообщение об ошибке, но ваш обработчик ошибок также выходит из предупреждений.

Сообщение с предупреждением совершенно ясно: вы должны использовать локальные переменные, а не пользовательские (сессионные) переменные внутриСоставной блок операторов mysql.

Пользовательские переменные обозначаются префиксом @ (@variablename), в то время как локальные переменные не имеют префикса, но должны быть объявлены (declare variablename type) перед их использованием.Декларации должны предшествовать любому другому утверждению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...