Выберите в переменную в MySQL объявить причины синтаксической ошибки?


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

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 79

10 ответов:

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

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

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

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

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

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

DELIMITER ;

call test ();

эти ответы не очень хорошо охватывают несколько переменных.

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

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

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

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

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

SELECT myvar;

на документы MySQL объявить работает только в начале начала...Конечный блок как в сохраненной программе.

вам не нужно объявлять переменную в MySQL. Тип переменной определяется автоматически при первом присвоении ей значения. Его тип может быть одним из следующих: целочисленная, десятичная, с плавающей запятой, двоичная или небинарная строка или нулевое значение. Дополнительную информацию см. В документации по пользовательским переменным:

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

вы можете использовать SELECT ... В, чтобы назначить столбцы a переменная:

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;

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

Ура.