2012-12-02 16 views
21

Sto tentando di definire e inizializzare una variabile MySQL per una query.Variabili locali MySQL

Ho il seguente:

declare @countTotal int; 
SET @countTotal = select COUNT(*) 
from nGrams; 

Sto usando MySQL in NetBeans e mi dice che ho un errore. Cosa/dove è il mio errore?

Come posso risolvere questo?

risposta

31

MySQL ha due diversi tipi di variabili:

  • variabili locali (che non sono prefisso da @) sono fortemente tipizzati e con scope per il blocco di programma memorizzato in cui sono dichiarati. Si noti che, come documentato in DECLARE Syntax:

    DECLARE è consentito solo all'interno di una dichiarazione BEGIN ... END composto e deve essere al suo inizio, prima di qualsiasi altra dichiarazione.

  • user variables (che sono prefisso @) sono debolmente tipizzato e limitato l'ambito della sessione. Si noti che non hanno né bisogno né possono essere dichiarati — semplicemente li usano direttamente.

Pertanto, se si sta definendo un programma memorizzato e in realtà si vuole una "variabile locale", per la formulazione della tua domanda, è necessario eliminare il carattere @ e garantire che la vostra dichiarazione DECLARE è al inizio del tuo blocco di programma. Altrimenti, per utilizzare una "variabile utente", rilasciare l'istruzione DECLARE.

Inoltre, vi sia bisogno di circondare la query tra parentesi in modo da eseguirlo come una sottoquery:

SET @countTotal = (SELECT COUNT(*) FROM nGrams); 

Oppure, si potrebbe usare SELECT ... INTO:

SELECT COUNT(*) INTO @countTotal FROM nGrams; 
5

Prova questo: - esempio

select @countTotal := COUNT(*) from nGrams; 
+0

Penso che probabilmente hai intenzione di utilizzare l'operatore di assegnazione [': ='] (http://dev.mysql.com/doc/en/assignment-operators.html#operator_assign-value), piuttosto che il [' = 'operatore di uguaglianza] (http://dev.mysql.com/doc/en/comparison-operators.html#operator_equal)? – eggyal

+0

Grazie per l'importante aggiornamento @eggyal –

2

Funzione:

DROP FUNCTION IF EXISTS test; 

DELIMITER $$ 
CREATE FUNCTION test(in_number INT) RETURNS INT 
    BEGIN 
     DECLARE countTotal INT; 
     SET countTotal = SELECT COUNT(*) FROM nGrams; 
    RETURN countTotal + in_number; 
END $$ 
DELIMITER ; 
+0

stranamente mi sta dando 0. Se faccio un select * ottengo circa 100.000 righe ... – CodeKingPlusPlus

+0

Stai facendo una funzione o una procedura? – alditis

+0

[Una sottoquery deve sempre apparire tra parentesi.] (Https://dev.mysql.com/doc/en/subqueries.html) – eggyal

1

Secondo DECLARE Syntax , declare deve trovarsi all'interno di un inizio ... blocco finale.