SELECT INTO variabile in MySQL DECLARE causa errore di sintassi?
-
28-09-2019 - |
Domanda
I'd desidera selezionare un singolo valore in una variabile. I'd cercato di seguito:
DECLARE myvar INT(4);
-. Ritorna immediatamente qualche errore di sintassi
SELECT myvalue
FROM mytable
WHERE anothervalue = 1;
- restituisce un singolo intero
SELECT myvalue
INTO myvar
FROM mytable
WHERE anothervalue = 1;
- non funziona, anche provato @myvar
E 'possibile utilizzare DECLARE al di fuori della stored procedure o funzioni?
Forse ho semplicemente non ottengo il concetto di variabili utente ... Ho appena provato:
SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;
... che ha lavorato proprio come E'dovuto. Ma se corro ogni query alla volta ottengo solo NULL @var.
Soluzione 2
Alla fine di una stored procedure è stata la soluzione per il mio problema. Here's ciò che ha contribuito:
DELIMITER //
CREATE PROCEDURE test ()
BEGIN
DECLARE myvar DOUBLE;
SELECT somevalue INTO myvar FROM mytable WHERE uid=1;
SELECT myvar;
END
//
DELIMITER ;
call test ();
Altri suggerimenti
mi sono imbattuto in questo stesso problema, ma credo di sapere che cosa sta causando la confusione. Se si utilizza MySQL Query Analyzer, è possibile farlo bene:
SELECT myvalue
INTO @myvar
FROM mytable
WHERE anothervalue = 1;
Tuttavia, se si mette la stessa query in MySQL Workbench, getterà un errore di sintassi. Non so il motivo per cui sarebbero diverse, ma sono. Per aggirare il problema in MySQL Workbench, è possibile riscrivere la query in questo modo:
SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
Queste risposte non coprono molto bene più variabili.
Fare l'assegnazione inline in una stored procedure provoca tale risultato anche essere inviati indietro nel set di risultati. Che può essere fonte di confusione. Per usare la sintassi SELECT ... INTO con più variabili che fate:
SELECT a, b INTO @a, @b FROM mytable LIMIT 1;
Il SELECT deve restituire solo 1 fila, quindi LIMIT 1, anche se non è sempre necessaria.
È inoltre possibile utilizzare SET al posto di DECLARE
SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);
SELECT myvar;
la documentazione 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 determinata automaticamente quando viene assegnato prima un valore. Il suo tipo può essere: intero, decimale, virgola mobile, stringa binaria o non binari, o il valore NULL. Vedere la documentazione Variabili definite dall'utente per ulteriori informazioni:
http://dev.mysql.com/doc/ refman / 5.0 / it / user-variables.html
È possibile utilizzare SELECT ... INTO per colonne assegnare ad una variabile:
http://dev.mysql.com/ doc / refman / 5.0 / it / select-in-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 si può SELECT INTO
le variabili globali come:
SELECT ... INTO @XYZ ...
Puoi non le variabili globali uso FETCH INTO
come:
FETCH ... INTO @XYZ
appare come non è un bug . Spero che sarà utile a qualcuno ...
Sto usando la versione 6 (MySQL Workbench Community (GPL) per la versione di Windows 6.0.9 revisione 11421 costruzione 1170) in Windows Vista. Non ho alcun problema con le seguenti opzioni. Probabilmente è stato risolto dal momento che questi ragazzi hanno i problemi di 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';
Tutti opzione sopra di me danno un risultato corretto.
È forse manca il simbolo @ prima del vostro valore, come quello select 'test' INTO @myValue
;
Per quelli in esecuzione in tali questioni in questo momento, solo cercare di mettere un alias per la tabella, questo dovrebbe il trucco, per esempio:
SELECT myvalue
INTO myvar
FROM mytable x
WHERE x.anothervalue = 1;
Ha funzionato per me.
Saluti.