12

Quando creo la procedura salvata, posso creare una variabile sì? per esempio:Imposta il risultato della variabile, dalla query

CREATE PROCEDURE `some_proc`() 
BEGIN 

    DECLARE some_var INT; 
    SET some_var = 3; 
.... 

DOMANDA: ma come impostare variabile risultato dalla query, che è il modo di fare un po 'come questo:

DECLARE some_var INT; 
SET some_var = SELECT COUNT(*) FROM mytable ; 

?

+0

Vedi qui, la tua domanda è possibile duplicare. http://stackoverflow.com/questions/3888735/mysql-set-user-variable-from-result-of-query?rq=1 – bodi0

+1

No, non proprio un duplicato. L'argomento di http://stackoverflow.com/questions/3888735/mysql-set-user-variable-from-result-of-query?rq=1 è "variabili definite dall'utente". Questa domanda riguarda le variabili locali della stored procedure. La sintassi nella mia risposta funziona anche per le variabili definite dall'utente, ma non viceversa. –

risposta

33

Ci sono diversi modi per farlo.

È possibile utilizzare una sottoquery:

SET some_var = (SELECT COUNT(*) FROM mytable); 

(come il vostro originale, basta aggiungere parentesi attorno alla query)

o utilizzare la sintassi SELECT INTO per assegnare più valori:

SELECT COUNT(*), MAX(col) 
INTO some_var, some_other_var 
FROM tab; 

La sintassi del subquery è leggermente più veloce (non so perché) ma funziona solo per assegnare un singolo valore. La selezione in sintassi consente di impostare più valori contemporaneamente, quindi se è necessario acquisire più valori dalla query, è necessario farlo piuttosto che eseguire la query più e più volte per ogni variabile.

Infine, se la query non restituisce una singola riga ma un gruppo di risultati, è possibile utilizzare uno cursor.

+0

Ti stai sbagliando. –

+0

Roland Bouman, grazie mille, la tua seconda variante funziona, ma prima di tutto, la parentesi non aiuta. :) –

+0

No. entrambi funzionano. Devi aver fatto un errore di sintassi. mysql> delimitatore // mysql> create function f() -> restituisce int -> begin -> declare v int; -> set v = (seleziona count (*) da dual); -> return v; -> fine; -> // Query OK, 0 righe interessate (0.05 sec) mysql> selezionare f(); -> // + ------ + | f() | + ------ + | 1 | + ------ + 1 riga nel set (0,00 secondi) mysql> select version(); -> // + ----------- + | versione() | + ----------- + | 5.5.20 | + ----------- + 1 riga nel set (0.00 sec) –

3

La seguente istruzione select dovrebbe consentire di salvare il risultato dal conteggio (*).

SELECT COUNT(*) FROM mytable INTO some_var; 
+2

MySQL consente di impostare la clausola INTO come ultima clausola alla fine dell'istruzione. Tuttavia, in SQL standard appare tra la SELECT e la clausola FROM. –

+0

juergen d, grazie molte. :) –

Problemi correlati