Выберите в переменную в MySQL DECLARE заставляет синтаксис ошибки?
-
28-09-2019 - |
Вопрос
Я хотел бы выбрать одно значение в переменной. Я пытался следовать:
DECLARE myvar INT(4);
- Немедленно возвращает некоторую ошибку синтаксиса.
SELECT myvalue
FROM mytable
WHERE anothervalue = 1;
- возвращает одно целое число
SELECT myvalue
INTO myvar
FROM mytable
WHERE anothervalue = 1;
- Не работает, также пробовал @myvar
Можно использовать объявление вне сохраненных процедур или функций?
Может быть, я просто не получаю концепцию пользовательских переменных ... Я просто попробовал:
SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;
... который работал так же, как он должен. Но если я бегу каждый запрос в то время, я просто получаю @var null.
Решение 2
В конце хранимая процедура была решение для моей проблемы. Вот что помогло:
DELIMITER //
CREATE PROCEDURE test ()
BEGIN
DECLARE myvar DOUBLE;
SELECT somevalue INTO myvar FROM mytable WHERE uid=1;
SELECT myvar;
END
//
DELIMITER ;
call test ();
Другие советы
Я столкнулся с этой же проблемой, но я думаю, что знаю, что вызывает путаницу. Если вы используете MySQL Query Analyzer, вы можете сделать это просто хорошо:
SELECT myvalue
INTO @myvar
FROM mytable
WHERE anothervalue = 1;
Однако, если вы поместите этот же запрос в MySQL Workbench, он будет бросать синтаксическую ошибку. Я не знаю, почему они будут разными, но они есть. Чтобы обойти проблему в MySQL Workbench, вы можете переписать такое запрос:
SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
Эти ответы не охватывают очень хорошо несколько переменных.
Выполнение встроенного назначения в хранимой процедуре приводит к тому, что эти результаты также могут быть отправлены обратно в результаты. Это может быть запутано. Чтобы использовать SELECT ... в синтаксис с несколькими переменными, которые вы делаете:
SELECT a, b INTO @a, @b FROM mytable LIMIT 1;
Выбор должен вернуться только 1 строка, следовательно, ограничение 1, хотя это не всегда необходимо.
Вы также можете использовать набор вместо объявления
SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);
SELECT myvar;
Нами Документы MySQL Объявите работу только в начале начала ... End Block, как в сохраненной программе.
Вам не нужно объявлять переменную в MySQL. Тип переменной определяется автоматически при первом назначении значение. Его тип может быть одним из: целочисленного, десятичной, плавающей точкой, двоичной или нечеснарной строки или нулевое значение. Смотрите пользовательские переменные документации для получения дополнительной информации:
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html.
Вы можете использовать Select ... IN на присвоении столбцов к переменной:
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)
Стоит отметить, что несмотря на то, что вы можете SELECT INTO
Глобальные переменные, такие как:
SELECT ... INTO @XYZ ...
Ты сможешь НЕТ использовать FETCH INTO
Глобальные переменные, такие как:
FETCH ... INTO @XYZ
Похоже, это не ошибка. Отказ Я надеюсь, что это будет полезно для кого-то ...
Я использую версию 6 (Mysql Workbench Community (GPL) для Windows версии 6.0.9 Revision 11421 Build 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';
Весь опция выше дает мне правильный результат.
Возможно, вы пропустите символ @ до вашей ценности, как это select 'test' INTO @myValue
;
Для тех, кто работает в таких проблемах прямо сейчас, просто попробуйте поставить псевдоним для таблицы, это должен быть трюк, например:
SELECT myvalue
INTO myvar
FROM mytable x
WHERE x.anothervalue = 1;
Это сработало для меня.
Ваше здоровье.