SELECT INTO Змінна в MySQL DECLARE викликає синтаксичну помилку?


94

Я хотів би ВИБРАТИ одне значення у змінну. Я намагався дотримуватися:

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.

Відповіді:


109

Я зіткнувся з цим самим питанням, але, думаю, знаю, що викликає плутанину. Якщо ви використовуєте MySql Query Analyzer, ви можете зробити це чудово:

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

Однак якщо ви вкладете той самий запит у MySql Workbench, він викличе синтаксичну помилку. Не знаю, чому вони були б іншими, але вони є. Щоб вирішити проблему в MySql Workbench, ви можете переписати запит так:

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

6
Справді, це цікаво. До запитання додано тег MySQL Workbench - тому інші можуть виявити, що ця проблема пов’язана з MySQL Workbench.
Matt Bannert,

1
Я використовував версію MySQL версії 5.2.47, версія 10398 на Fedora 18, і з нею немає такої проблеми.
GoYun.Info

41

Врешті-решт збережена процедура стала рішенням моєї проблеми. Ось що допомогло:

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

DELIMITER ;

call test ();

Thx для тестування ... звучить цікаво. На жаль, я не отримую останнього речення. Ти забув слово-два?
Метт Баннерт,

41

Ці відповіді не дуже добре охоплюють МНОГО ЗМІННИХ.

Виконання вбудованого призначення у збереженій процедурі призводить до того, що ці результати ТАКЖЕ відправляються назад у набір результатів. Це може заплутати. Для використання синтаксису SELECT ... INTO з кількома змінними ви робите:

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

SELECT повинен повертати лише 1 рядок, отже LIMIT 1, хоча це не завжди потрібно.


Я намагався зробити те саме, змінні без @ також працювали для мене. Дякую
Ананд Рокзз

2
так, у збереженій процедурі змінні не повинні починатися з @. Але простіше продемонструвати такий шлях.
Гарр Годфрі,


15

Згідно з документами MySQL DECLARE працює лише на початку блоку BEGIN ... END, як у збереженій програмі.


Після того, як погуглити для "mysql select inside procedure" і прибув сюди, відсутність оголошень на початку - це те, що спричинило syntax error, missing ;помилку для мене.
Miguel Pynto

12

Вам не потрібно ДЕКЛАРУВАТИ змінну в 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)

1
Хм, я якось тут у мене проблеми ... ВИБЕРІТЬ 1 В @var; також повертає синтаксичну помилку. так само робить: ВИБЕРІТЬ somevar INTO @var FROM mytable; Можливо, це проблема DELIMITER?
Метт Баннерт,

Яку помилку ви отримуєте? Яку версію MySQL ви використовуєте?
Майк

Код помилки: 1064. У вас є помилка в синтаксисі SQL; перевірте інструкцію, яка відповідає версії вашого сервера MySQL, на правильний синтаксис, який слід використовувати біля 'INTO @var' у рядку 3. Версія = 5.5.16
Скотт

4

Варто зазначити, що, незважаючи на той факт, що ви можете використовувати такі SELECT INTOглобальні змінні:

SELECT ... INTO @XYZ ...

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

FETCH ... INTO @XYZ

Схоже, це не помилка . Сподіваюся, це комусь буде корисно ...


3

Я використовую версію 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';

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


3

Для тих, хто працює з такими проблемами прямо зараз, просто спробуйте поставити псевдонім для таблиці, це має бути фокусом, наприклад:

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

У мене це спрацювало.

Ура.


1

Можливо, вам не вистачає символу @ перед вашим значенням, наприклад select 'test' INTO @myValue;


Це змінна сеансу, інша тема
Адам Ф,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.