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.
Ответы
Ответ 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;
Это сработало для меня.
Приветствия.