SELECT INTO Variable в MySQL DECLARE вызывает синтаксическую ошибку?

Я хотел бы ВЫБРАТЬ одно значение в переменную. Я пытался сделать следующее:

DECLARE myvar INT(4);

-- немедленно возвращает некоторую синтаксическую ошибку.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

-- возвращает одно целое число

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

-- не работает, также пробовал @myvar

Можно ли использовать DECLARE вне хранимых процедур или функций?

Может быть, я просто не понимаю концепции пользовательских переменных... Я только что попробовал:

SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;

... который работал так, как должен. Но если я запускаю каждый запрос за раз, я просто получаю @var NULL.


person Matt Bannert    schedule 19.06.2010    source источник


Ответы (11)


Я столкнулся с этой же проблемой, но я думаю, что знаю, что вызывает путаницу. Если вы используете MySQL Query Analyzer, вы можете сделать это просто отлично:

SELECT myvalue 
INTO @myvar 
FROM mytable 
WHERE anothervalue = 1;

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

Чтобы обойти проблему в MySQL Workbench, вы можете переписать запрос следующим образом:

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
person Tim Gautier    schedule 07.09.2011
comment
Ведь это интересно. К вопросу добавлен тег MySQL Workbench, чтобы другие могли обнаружить, что эта проблема связана с MySQL Workbench. - person Matt Bannert; 08.09.2011
comment
Я использовал MySQL workbench версии 5.2.47 rev 10398 на Fedora 18, и с ним такой проблемы нет. - person GoYun.Info; 18.04.2013
comment
второе решение := будет объявлено устаревшим. Поэтому предпочитайте использовать SELECT ... INTO ! - person Meloman; 14.09.2020

В конце концов, хранимая процедура стала решением моей проблемы.

Вот что помогло:

DELIMITER //

CREATE PROCEDURE test ()
BEGIN
  DECLARE myvar DOUBLE;
  SELECT somevalue INTO myvar FROM mytable WHERE uid = 1;

  SELECT myvar;
END//

DELIMITER ;

call test();
person Matt Bannert    schedule 19.06.2010
comment
Спасибо за тестирование... звучит интересно. К сожалению, я не понимаю последнюю фразу. Вы забыли слово или два? - person Matt Bannert; 23.11.2010

Эти ответы не очень хорошо охватывают НЕСКОЛЬКО переменных.

Выполнение встроенного назначения в хранимой процедуре приводит к тому, что эти результаты ТАКЖЕ отправляются обратно в набор результатов. Это может сбивать с толку. Чтобы использовать синтаксис SELECT...INTO с несколькими переменными, выполните следующие действия:

SELECT a, b INTO @a, @b FROM mytable LIMIT 1;

SELECT должен возвращать только 1 строку, следовательно, LIMIT 1, хотя это не всегда необходимо.

person Garr Godfrey    schedule 09.09.2014
comment
Я пытался сделать то же самое, у меня тоже работали переменные без @. Спасибо - person Anand Rockzz; 31.05.2017
comment
да, в хранимой процедуре переменные не должны начинаться с @. Но так проще продемонстрировать. - person Garr Godfrey; 26.07.2017

Вы также можете использовать SET вместо DECLARE

SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);

SELECT myvar;
person Somwang Souksavatd    schedule 13.10.2014

Согласно документам MySQL DECLARE работает только в начале BEGIN ...END блок, как в сохраненной программе.

person Dan U.    schedule 19.06.2010
comment
После того, как я погуглил «внутреннюю процедуру выбора mysql» и прибыл сюда, отсутствие объявлений в начале было причиной ошибки syntax error, missing ; для меня. - person Miguel Pynto; 25.09.2018

Вам не нужно ОБЪЯВЛЯТЬ переменную в MySQL. Тип переменной определяется автоматически, когда ей впервые присваивается значение. Его тип может быть одним из следующих: целое число, десятичное число, число с плавающей запятой, двоичная или недвоичная строка или значение NULL. Дополнительную информацию см. в документации по пользовательским переменным:

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

Вы можете использовать SELECT ... INTO для назначения столбцов переменной:

http://dev.mysql.com/doc/refman/5.0/en/select-into-statement.html

Пример:

mysql> SELECT 1 INTO @var;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @var;
+------+
| @var |
+------+
| 1    |
+------+
1 row in set (0.00 sec)
person Mike    schedule 19.06.2010
comment
Хм, у меня тут проблемы.. SELECT 1 INTO @var; также возвращает синтаксическую ошибку. то же самое: SELECT somevar INTO @var FROM mytable; Может проблема в DELIMITER? - person Matt Bannert; 19.06.2010
comment
Какую ошибку вы получаете? Какую версию MySQL вы используете? - person Mike; 19.06.2010
comment
Код ошибки: 1064. У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с «INTO @var» в строке 3. Версия = 5.5.16 - person Scott Willeke; 30.09.2011

Стоит отметить, что несмотря на то, что вы можете SELECT INTO глобальные переменные, такие как:

SELECT ... INTO @XYZ ...

Вы можете НЕ использовать FETCH INTO глобальные переменные, такие как:

FETCH ... INTO @XYZ

Похоже, это не ошибка. Надеюсь кому-то будет полезно...

person b.b3rn4rd    schedule 30.01.2014

Я использую версию 6 (Сообщество MySQL Workbench (GPL) для Windows версии 6.0.9, редакция 11421, сборка 1170) в Windows Vista. У меня нет проблем со следующими вариантами. Вероятно, они исправили это, так как эти ребята получили проблемы три года назад.

/* first option */
SELECT ID 
INTO @myvar 
FROM party 
WHERE Type = 'individual';

-- get the result
select @myvar;

/* second option */
SELECT @myvar:=ID
FROM party
WHERE Type = 'individual';


/* third option. The same as SQL Server does */
SELECT @myvar = ID FROM party WHERE Type = 'individual';

Все варианты выше дают мне правильный результат.

person Tman    schedule 17.05.2014

Для тех, кто сталкивается с такими проблемами прямо сейчас, просто попробуйте указать псевдоним для таблицы, это должно помочь, например:

SELECT myvalue 
  INTO myvar 
  FROM mytable x
 WHERE x.anothervalue = 1;

Это сработало для меня.

Ваше здоровье.

person emmanuel    schedule 30.11.2016

Возможно, вы пропустили символ @ перед своим значением, например select 'test' INTO @myValue;

person HiMan    schedule 13.08.2016
comment
Это переменная сеанса, другая тема - person Adam F; 29.09.2016

SELECT c1, c2, c3,... INTO @v1, @v2, @v3,... FROM table_name WHERE условие;

person Mehrdad Masoumi    schedule 20.01.2020