La variabile SELECT INTO in MySQL DECLARE causa un errore di sintassi?


94

Vorrei SELEZIONARE un singolo valore in una variabile. Avevo provato a seguire:

DECLARE myvar INT(4);

- restituisce immediatamente un errore di sintassi.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

- restituisce un singolo numero intero

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

- non funziona, ho provato anche @myvar

È possibile utilizzare DECLARE al di fuori di stored procedure o funzioni?

Forse non capisco il concetto di variabili utente ... Ho appena provato:

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

... che ha funzionato proprio come dovrebbe. Ma se eseguo ogni query alla volta ottengo solo @var NULL.

Risposte:


109

Ho riscontrato lo stesso problema, ma penso di sapere cosa sta causando la confusione. Se usi MySql Query Analyzer, puoi farlo bene:

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

Tuttavia, se inserisci la stessa query in MySql Workbench, verrà generato un errore di sintassi. Non so perché sarebbero diversi, ma lo sono. Per aggirare il problema in MySql Workbench, puoi riscrivere la query in questo modo:

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

6
In effetti questo è interessante. Aggiunto un tag MySQL workbench alla domanda, così altri potrebbero scoprire che questo problema è correlato a MySQL Workbench.
Matt Bannert

1
Ho usato MySQL workbench versione 5.2.47 rev 10398 su Fedora 18 e non ci sono problemi del genere.
GoYun.Info

41

Alla fine una procedura memorizzata è stata la soluzione al mio problema. Ecco cosa ha aiutato:

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

DELIMITER ;

call test ();

Grazie per il test ... sembra interessante. Purtroppo non ricevo l'ultima frase. Hai dimenticato una parola o due?
Matt Bannert

40

Queste risposte non coprono molto bene MULTIPLE variabili.

L'esecuzione dell'assegnazione inline in una stored procedure fa sì che quei risultati vengano ANCHE rinviati nel gruppo di risultati. Questo può creare confusione. Per utilizzare la sintassi SELECT ... INTO con più variabili devi:

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

Il SELECT deve restituire solo 1 riga, quindi LIMIT 1, anche se non è sempre necessario.


Stavo cercando di fare lo stesso, anche le variabili senza @ hanno funzionato per me. Grazie
Anand Rockzz

2
sì, in una procedura memorizzata le variabili non devono iniziare con @. Ma è più facile dimostrare in questo modo.
Garr Godfrey

21

È inoltre possibile utilizzare SET invece di DECLARE

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

SELECT myvar;

15

Secondo la documentazione di MySQL, DECLARE funziona solo all'inizio di un blocco BEGIN ... END come in un programma memorizzato.


Dopo aver cercato su Google 'mysql select inside procedure' ed è arrivato qui, non avere le dichiarazioni all'inizio è ciò che ha causato l' syntax error, missing ;errore per me.
Miguel Pynto

12

Non è necessario DECLARE una variabile in MySQL. Il tipo di una variabile viene determinato automaticamente quando le viene assegnato un valore per la prima volta. Il tipo può essere uno dei seguenti: intero, decimale, virgola mobile, stringa binaria o non binaria o valore NULL. Vedere la documentazione sulle variabili definite dall'utente per ulteriori informazioni:

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

È possibile utilizzare SELECT ... INTO per assegnare colonne a una variabile:

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

Esempio:

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, in qualche modo sono nei guai qui .. SELECT 1 INTO @var; restituisce anche un errore di sintassi. così fa: SELECT somevar INTO @var FROM mytable; Forse è un problema di DELIMITER?
Matt Bannert

Che errore stai ricevendo? Quale versione di MySQL stai usando?
Mike

Codice errore: 1064. Hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'INTO @var' alla riga 3. Versione = 5.5.16
Scott Willeke

4

Vale la pena notare che nonostante sia possibile SELECT INTOvariabili globali come:

SELECT ... INTO @XYZ ...

NON puoi usare FETCH INTOvariabili globali come:

FETCH ... INTO @XYZ

Sembra che non sia un bug . Spero possa essere d'aiuto a qualcuno ...


3

Sto utilizzando la versione 6 (MySQL Workbench Community (GPL) per Windows versione 6.0.9 revisione 11421 build 1170) su Windows Vista. Non ho problemi con le seguenti opzioni. Probabilmente l'hanno risolto da quando questi ragazzi hanno avuto i problemi tre anni fa.

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

Tutte le opzioni sopra mi danno un risultato corretto.


3

Per coloro che hanno problemi del genere in questo momento, prova a mettere un alias per la tabella, questo dovrebbe essere il trucco, ad esempio:

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

Ha funzionato per me.

Saluti.


1

Forse ti manca il simbolo @ prima del tuo valore, in questo modo select 'test' INTO @myValue;


Questa è una variabile di sessione, un argomento diverso
Adam F

0

SELEZIONA c1, c2, c3, ... INTO @ v1, @ v2, @ v3, ... FROM nome_tabella WHERE condizione;

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.