SELECT INTO Переменная в MySQL DECLARE вызывает синтаксическую ошибку? - PullRequest
86 голосов
/ 19 июня 2010

Я хотел бы выбрать одно значение в переменной. Я пытался следующее:

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.

Ответы [ 10 ]

100 голосов
/ 07 сентября 2011

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

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

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

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
35 голосов
/ 19 июня 2010

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

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

DELIMITER ;

call test ();
34 голосов
/ 10 сентября 2014

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

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

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

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

18 голосов
/ 13 октября 2014

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

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

SELECT myvar;
14 голосов
/ 19 июня 2010

Per документы MySQL DECLARE работают только при запуске блока BEGIN ... END, как в хранимой программе.

9 голосов
/ 19 июня 2010

Вам не нужно ОБЪЯВЛЯТЬ переменную в 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)
3 голосов
/ 30 января 2014

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

SELECT ... INTO @XYZ ...

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

FETCH ... INTO @XYZ

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

2 голосов
/ 18 мая 2014

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

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

1 голос
/ 30 ноября 2016

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

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

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

Приветствие.

1 голос
/ 13 августа 2016

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

...