MySQL默認不支持表名作為變量名。
1)案例說明
若有一下存儲過程:
drop procedure if exists selectByTableName; create procedure selectByTableName(in tableName varchar(50)) begin select * from tableName; end;
在進行調用時會報錯:
call selectByTableName('user')
> 1146 - Table 'db2020.tablename' doesn't exist
> 時間: 0s
原因是它把變量tableName作為了表名,並不是把傳入的值作為表名。
2)解決方案
解決方法是使用concat函數,然后用預處理語句傳入動態表名來執行sql,對於增刪改查都適用。
將上述的存儲過程修改如下:
drop procedure if exists selectByTableName; create procedure selectByTableName(in tableName varchar(50)) begin #定義語句 set @stmt = concat('select * from ',tableName); #預定義sql語句,從用戶變量中獲取 prepare stmt from @stmt; #執行sql語句 execute stmt; #釋放資源,后續還可以使用 deallocate prepare stmt; end;
再調用時就能正常查詢出結果了。在預處理語句中,使用了用戶變量,變量名是自定義的。
