2013-03-28 19 views
5

Dlaczego pojawia się ten błąd?Błąd mysql przy użyciu zmiennej jako nazwa tabeli

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 

Błąd:

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

Mój kod jest poprawny, ale nie rozumiem dlaczego ....

+0

Nie sądzę, można użyć zmiennych dla nazw tabel w dynamiczny SQL. W Oracle na pewno nie możesz. Myślę, że musisz połączyć, zobacz odpowiedź JW: – Sebas

+0

@Sebas: Co jeśli używam "delete frrom .... where", odpowiedź JW jest nadal akceptowalna? –

+0

Tak, myślę, że on odpowiedział na wszystkie twoje pytania. – Sebas

Odpowiedz

4

Chyba masz na myśli,

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 

nawet w dynamiczny sql, nie można sparametryzować nazw tabel, a także nazw kolumn, aby y wybór polega na łączeniu się z ciągiem znaków. Tylko wartości mogą być umieszczone w miejscu właściciela.


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

Co zrobić, jeśli chcę podać identyfikator w parametrze? Powiedzmy, że chcę zapytać w ten sposób "Delete from tablename where id = idnumber"? –

+0

'SET @sql = 'Usuń z nazwy tabeli, gdzie id =?'' Możesz umieścić wartość 'idnumber' w symbolu zastępczym. –

+0

To znaczy, nadal używam tego kodu powyżej, ale tym razem z klauzulą ​​where. Jak konkatować, w tym, gdzie? –

Powiązane problemy