SELEZIONA NELLA Variabile in MySQL DECLARE causa un errore di syntax?

Mi piacerebbe SELEZIONARE un singolo valore in una variabile. Ho provato a seguire:

DECLARE myvar INT(4); 

– restituisce immediatamente un errore di syntax.

 SELECT myvalue FROM mytable WHERE anothervalue = 1; 

– restituisce un singolo intero

 SELECT myvalue INTO myvar FROM mytable WHERE anothervalue = 1; 

– non funziona, ha anche provato @myvar

È ansible utilizzare DECLARE al di fuori delle procedure o delle funzioni memorizzate?

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 esattamente come dovrebbe. Ma se eseguo ogni query alla volta ottengo @var NULL.

Mi sono imbattuto in questo stesso problema, ma penso di sapere cosa sta causando la confusione. Se si utilizza MySql Query Analyzer, è ansible farlo bene:

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

Tuttavia, se si inserisce la stessa query in MySql Workbench, verrà generato un errore di syntax. 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; 

Alla fine una procedura memorizzata era la soluzione per il 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 (); 

Queste risposte non coprono molto bene le variabili MULTIPLE.

Effettuare l’assegnazione in linea in una stored procedure fa sì che quei risultati vengano anche rimandati nel set di risultati. Questo può essere fonte di confusione. Per usare la syntax SELECT … INTO con più variabili fai:

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

SELECT deve restituire solo 1 riga, quindi LIMIT 1, sebbene ciò non sia sempre necessario.

Puoi anche usare SET invece di DECLARE

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

Per i documenti MySQL DECLARE funziona solo all’inizio di un blocco BEGIN … END come in un programma memorizzato.

Non è necessario DICHIARARE una variabile in MySQL. Il tipo di una variabile viene determinato automaticamente quando viene assegnato per la prima volta un valore. Il suo tipo può essere uno di: intero, decimale, virgola mobile, binario o non binario o valore NULL. Consultare la documentazione relativa alle variabili definite dall’utente per ulteriori informazioni:

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

Puoi usare 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) 

Vale la pena notare che, nonostante il fatto che tu possa SELECT INTO variabili globali come:

SELECT ... INTO @XYZ ...

NON puoi usare FETCH INTO variabili globali come:

FETCH ... INTO @XYZ

Sembra che non sia un bug . Spero che sarà utile a qualcuno …

Sto usando la versione 6 (MySQL Workbench Community (GPL) per Windows versione 6.0.9 revisione 11421 build 1170) su Windows Vista. Non ho alcun problema con le seguenti opzioni. Probabilmente l’hanno riparato 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.

Forse ti manca il simbolo @ prima del tuo valore, ad esempio select 'test' INTO @myValue ;

Per quelli che corrono in questo momento, prova a inserire un alias per il tavolo, questo dovrebbe essere il trucco, ad esempio:

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

Ha funzionato per me.

Saluti.