Подтвердить что ты не робот

SELECT INTO Переменная в 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.

4b9b3361

Ответ 1

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

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

DELIMITER ;

call test ();

Ответ 2

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

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

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

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

Ответ 3

Эти ответы не очень хорошо отражают переменные MULTIPLE.

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

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

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

Ответ 4

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

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

SELECT myvar;

Ответ 5

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

Ответ 6

Вам не нужно DECLARE переменной в 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)

Ответ 7

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

SELECT ... INTO @XYZ ...

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

FETCH ... INTO @XYZ

Похоже, это не bug. Я надеюсь, что это будет полезно кому-то...

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

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

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

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