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

94

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

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.

Мэтт Баннерт
источник

Ответы:

111

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

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

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

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
Тим Готье
источник
6
Это действительно интересно. К вопросу добавлен тег MySQL Workbench, чтобы другие могли обнаружить, что эта проблема связана с MySQL Workbench.
Мэтт Баннерт
1
Я использовал рабочую среду MySQL версии 5.2.47 rev 10398 на Fedora 18, и с ней нет такой проблемы.
GoYun.Info
второе решение :=будет устаревшим. Так что предпочитаю использовать SELECT ... INTO!
Меломан,
42

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

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

DELIMITER ;

call test ();
Мэтт Баннерт
источник
Спасибо за тестирование ... звучит интересно. К сожалению, я не понял последнего предложения. Вы забыли пару слов?
Мэтт Баннерт,
41

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

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

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

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

Гарр Годфри
источник
Я пытался сделать то же самое, переменные без @ тоже у меня работали. Спасибо
Anand Rockzz
2
да, в хранимой процедуре переменные не должны начинаться с @. Но так проще продемонстрировать.
Гарр Годфри
22

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

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

SELECT myvar;
Somwang Souksavatd
источник
15

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

Дэн У.
источник
После поиска в Google «mysql select inside procedure» и прибытия сюда, отсутствие объявлений в начале - вот что вызывало syntax error, missing ;для меня ошибку.
Мигель Пинто
12

Вам не нужно ОБЪЯВЛЯТЬ переменную в 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)
Майк
источник
1
Хм, у меня тут как-то проблемы .. ВЫБЕРИТЕ 1 В @var; также возвращает синтаксическую ошибку. так же: ВЫБЕРИТЕ somevar INTO @var FROM mytable; Может, это проблема с DELIMITER?
Мэтт Баннерт
Какую ошибку вы получаете? Какую версию MySQL вы используете?
Майк,
Код ошибки: 1064. У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии вашего сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'INTO @var' в строке 3. Версия = 5.5.16
Скотт Виллеке
4

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

SELECT ... INTO @XYZ ...

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

FETCH ... INTO @XYZ

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

b.b3rn4rd
источник
3

Я использую версию 6 (MySQL Workbench Community (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';

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

Тман
источник
3

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

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

У меня это сработало.

Ура.

Эммануэль
источник
1

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

Привет Чувак
источник
Это переменная сеанса, другая тема
Адам Ф
0

ВЫБЕРИТЕ c1, c2, c3, ... INTO @ v1, @ v2, @ v3, ... FROM table_name WHERE condition;

Мехрдад Масуми
источник