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.

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;

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 ();

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.


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;

15

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


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)

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 ...


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.


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.



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.