2013-03-28 15 views
5

Perché viene visualizzato questo errore?mysql utilizzando la variabile come nome tabella

CREATE DEFINER=`root`@`localhost` PROCEDURE `selectrecords`(tablename varchar(50)) 
begin 
set @table_name=tablename; 
set @sql_text=concat('Select * from @table_name'); 
prepare statement from @sql_text; 
execute statement; 
deallocate prepare statement; 
end 

Errore:

....to use near '@table_name' at line 1 

Il mio codice è corretto, ma non capisco il motivo per cui ....

+0

non credo che è possibile utilizzare le variabili per i nomi delle tabelle in SQL dinamico. In Oracle non puoi assolutamente. Penso che devi concatenare, vedi la risposta di JW – Sebas

+0

@Sebas: Cosa succede se sto usando "cancella da .... dove", la risposta di JW è ancora accettabile? –

+0

sì, penso che abbia praticamente risposto a tutte le tue domande. – Sebas

risposta

4

Credo che si intende,

CREATE PROCEDURE `selectrecords`(tablename varchar(50)) 
begin 
    set @sql_text = concat('Select * from ', tablename); 
    prepare statement from @sql_text; 
    execute statement; 
    deallocate prepare statement; 
end 

anche in dinamico sql, non è possibile parametrizzare i nomi delle tabelle come pure i nomi delle colonne in modo tale La scelta è concatenare con la stringa. Solo i valori possono essere posizionati in un segnaposto.


UPDATE 1

CREATE PROCEDURE `selectrecords`(tablename varchar(50)) 
begin 
    set @val = idnumber; 
    set @sql_text = concat('Select * from ', tablename, ' WHERE id = ?'); 
    prepare statement from @sql_text; 
    execute statement USING @val; 
    deallocate prepare statement; 
end 
+0

Cosa succede se voglio includere l'id nel parametro? Diciamo che voglio interrogare in questo modo "Elimina da tablename dove id = idnumber"? –

+0

'SET @sql = 'Elimina da tablename dove id =?'' Puoi inserire il valore di 'idnumber' in un segnaposto. –

+0

Voglio dire sto ancora usando quel codice sopra ma questa volta con la clausola where. Come concatenare dove? –

Problemi correlati