SELECT INTO Zmienna w MySQL DECLARE powoduje błąd składni?

94

Chciałbym WYBRAĆ pojedynczą wartość w zmiennej. Próbowałem śledzić:

DECLARE myvar INT(4);

- natychmiast zwraca błąd składni.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

- zwraca jedną liczbę całkowitą

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

- nie działa, wypróbowałem również @myvar

Czy można używać DECLARE poza procedurami składowanymi lub funkcjami?

Może po prostu nie rozumiem pojęcia zmiennych użytkownika ... po prostu próbowałem:

SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;

... który działał tak, jak powinien. Ale jeśli uruchomię każde zapytanie na raz, po prostu otrzymam @var NULL.

Matt Bannert
źródło

Odpowiedzi:

111

Natknąłem się na ten sam problem, ale myślę, że wiem, co powoduje zamieszanie. Jeśli używasz MySql Query Analyzer, możesz to zrobić dobrze:

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

Jeśli jednak umieścisz to samo zapytanie w MySql Workbench, zgłosi błąd składni. Nie wiem, dlaczego mieliby być inni, ale tak jest. Aby obejść problem w MySql Workbench, możesz przepisać zapytanie w następujący sposób:

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
Tim Gautier
źródło
6
Rzeczywiście, jest to interesujące. Do pytania dodano tag MySQL Workbench - aby inni mogli stwierdzić, że ten problem jest związany z MySQL Workbench.
Matt Bannert,
1
Użyłem środowiska roboczego MySQL w wersji 5.2.47 rev 10398 na Fedorze 18 i nie ma z nim takiego problemu.
GoYun.Info
drugie rozwiązanie :=zostanie wycofane. Więc wolisz używać SELECT ... INTO!
Meloman
42

Ostatecznie procedura składowana była rozwiązaniem mojego problemu. Oto, co pomogło:

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

DELIMITER ;

call test ();
Matt Bannert
źródło
Dzięki za test ... brzmi interesująco. Niestety nie dostaję ostatniego zdania. Czy zapomniałeś słowa lub dwóch?
Matt Bannert
41

Te odpowiedzi nie obejmują zbyt dobrze MULTIPLE zmiennych.

Wykonanie przypisania w linii w procedurze składowanej powoduje, że wyniki te są RÓWNIEŻ wysyłane z powrotem w zestawie wyników. To może być mylące. Aby użyć składni SELECT ... INTO z wieloma zmiennymi, należy:

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

SELECT musi zwracać tylko 1 wiersz, stąd LIMIT 1, chociaż nie zawsze jest to konieczne.

Garr Godfrey
źródło
Próbowałem zrobić to samo, zmienne bez @ również działały dla mnie. Dzięki
Anand Rockzz
2
tak, w procedurze składowanej zmienne nie muszą zaczynać się od @. Ale łatwiej jest to zademonstrować.
Garr Godfrey
22

Możesz także użyć SET zamiast DECLARE

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

SELECT myvar;
Somwang Souksavatd
źródło
15

Zgodnie z dokumentacją MySQL DECLARE działa tylko na początku bloku BEGIN ... END, tak jak w zapisanym programie.

Dan U.
źródło
Po wygooglowaniu „mysql select inside procedure” i dotarciu tutaj, brak deklaracji na początku jest przyczyną syntax error, missing ;błędu.
Miguel Pynto
12

Nie musisz DEKLAROWAĆ zmiennej w MySQL. Typ zmiennej jest określany automatycznie, gdy po raz pierwszy zostanie przypisana jej wartość. Jego typem może być: liczba całkowita, dziesiętna, zmiennoprzecinkowa, ciąg binarny lub niebinarny lub wartość NULL. Aby uzyskać więcej informacji, zobacz dokumentację zmiennych definiowanych przez użytkownika:

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

Możesz użyć polecenia SELECT ... INTO, aby przypisać kolumny do zmiennej:

http://dev.mysql.com/doc/refman/5.0/en/select-into-statement.html

Przykład:

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)
Mikrofon
źródło
1
Hmm, mam tutaj kłopoty .. SELECT 1 INTO @var; zwraca również błąd składni. tak jest: SELECT somevar INTO @var FROM mytable; Może to problem z DELIMITEREM?
Matt Bannert
Jaki błąd otrzymujesz? Jakiej wersji MySQL używasz?
Mike
Kod błędu: 1064. Masz błąd w składni SQL; sprawdź podręcznik, który odpowiada Twojej wersji serwera MySQL, aby znaleźć właściwą składnię do użycia w pobliżu „INTO @var” w linii 3. Wersja = 5.5.16
Scott Willeke
4

Warto zauważyć, że pomimo tego, że można SELECT INTOzmienne globalne, takie jak:

SELECT ... INTO @XYZ ...

NIE możesz używać FETCH INTOzmiennych globalnych, takich jak:

FETCH ... INTO @XYZ

Wygląda na to, że to nie jest błąd . Mam nadzieję, że komuś to pomoże ...

b.b3rn4rd
źródło
3

Używam wersji 6 (MySQL Workbench Community (GPL) dla systemu Windows w wersji 6.0.9, wersja 11421, kompilacja 1170) w systemie Windows Vista. Nie mam problemu z następującymi opcjami. Prawdopodobnie naprawili to, ponieważ ci goście mieli problemy trzy lata temu.

/* 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';

Wszystkie powyższe opcje dają mi poprawny wynik.

Tman
źródło
3

Dla tych, którzy mają teraz takie problemy, po prostu spróbuj umieścić alias dla tabeli, to powinno wystarczyć, np:

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

U mnie to zadziałało.

Twoje zdrowie.

emmanuel
źródło
1

Być może przegapisz symbol @ przed wartością, w ten sposób select 'test' INTO @myValue;

Cześć mężczyzno
źródło
To zmienna sesyjna, inny temat
Adam F
0

SELECT c1, c2, c3, ... INTO @ v1, @ v2, @ v3, ... FROM nazwa_tabeli WHERE warunek;

Mehrdad Masoumi
źródło