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;