MySQL存儲過程使用動態表名


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;

再調用時就能正常查詢出結果了。在預處理語句中,使用了用戶變量,變量名是自定義的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM