mysql query dynamic in stored procedure

sto creando una query dynamic nella stored procedure. la mia stored procedure è la seguente:

CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40)) BEGIN SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team=",w_team); PREPARE stmt3 FROM @t1; EXECUTE stmt3; DEALLOCATE PREPARE stmt3; END 

quando provo a eseguirlo con la seguente chiamata:

 call test1 ('Test','SPA'); 

ottengo il seguente messaggio di errore:

Codice di errore: 1054. Colonna “SPA” sconosciuta in “clausola where”

ho provato senza condizioni e funziona bene, ma con la condizione where non funziona, ho provato a usare @ con il nome della variabile, ma ancora non funziona.

Grazie per l’aiuto.

Prova così:

 SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'"); 

Spiegazione :

la precedente query dynamic sarà simile a:

 SELECT * FROM Test where team=SPA 

E l’abbiamo cambiato in:

 SELECT * FROM Test where team='SPA' 

Prova questo..

 CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40)) BEGIN SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'"); PREPARE stmt3 FROM @t1; EXECUTE stmt3; DEALLOCATE PREPARE stmt3; END 

Ti mancano preventivi attorno alla variabile w_team ..

dovresti stampare la dichiarazione che crea dynamicmente in modo che tu possa semplicemente copiare la dichiarazione stampata e provare a trovare facilmente questo tipo di problema.

selezionare @ t1 stamperà la statistica che costruisce dynamicmente ..

Codice di errore: 1054. Colonna “SPA” sconosciuta in “clausola where”

Ciò accade quando non si racchiude la stringa di input tra virgolette e il motore SQL tenta di identificarlo come una colonna nella tabella interrogata. Ma fallisce perché non riesce a trovarlo.

Ma cosa succede quando trova una tale colonna?
Recupera i risultati quando trova alcune corrispondenze sui valori delle colonne.
Ovviamente questo non è quello che ci si aspettava.

Come superare questo? Utilizzare le istruzioni preparate con valori di input dinamici.

Puoi usare segnaposto come ? anche nelle stored procedure su valori di input dinamici da utilizzare con le Prepared Statements . Il motore gestirà i caratteri di escape e altri valori di stringa quando assegnati o confrontati all’interno di espressioni SQL.

Hai solo bisogno di riassegnare gli input della procedura a una o più variabili di sessione, come richiesto.

Esempio sulla tua procedura :

 CREATE PROCEDURE `test1`( IN tab_name VARCHAR(40), IN w_team VARCHAR(40) ) BEGIN SET @t1 = CONCAT( 'SELECT * FROM ', tab_name, ' where team = ?' ); -- <-- placeholder SET @w_team := w_team; PREPARE stmt3 FROM @t1; EXECUTE stmt3 USING @w_team; -- <-- input for placeholder DEALLOCATE PREPARE stmt3; END;