記錄mysql 存儲過程中通過使用PREPARE、EXECUTE 預處理語句實現執行動態SQL語句


背景:一個定時執行的存儲過程中需要用到分表的數據,需要根據當前執行時間確定要查詢哪個表的數據。

 

預處理語句語法如下:

# 
第一種使用方式: 使用USING 傳入參數

PREPARE stmt_name FROM preparable_stmt

EXECUTE stmt_name

 [USING @var_name [, @var_name] ...] 


{DEALLOCATE | DROP} PREPARE stmt_name

# 第二種使用方式: 

PREPARE ... FROM可以直接接用戶變量:
SET @select_test = CONCAT('SELECT * FROM ', @table_name);
PREPARE pr2 FROM @select_test;

 

 

我的實現方式是使用第二種方式 提前拼接好SQL語句 作為一個用戶變量。 

第一步 : 構造拼接你要執行的SQL語句 為preparable_stmt 部分:

SET @TargetTableName = CONCAT('xxxxxxx',DATE_FORMAT(NOW(),'%Y')); -- yourtablename_2022 你的分表格式,前綴加日期。。
SET @c_ExecSql = CONCAT(' SELECT AVG(AvgDust) INTO @c_AvgDust FROM  ', @TargetTableName);
SET @c_ExecSqlFinally = CONCAT(@c_ExecSql,' WHERE id = @id AND StartTime >=@StartTime AND EndTime <= @EndTime '); # 最終要執行的SQL語句

# 說明: 最終要執行的語句要看你自己的業務了 我這里只是計算一個均值, 直接使用了 CONCAT函數 把語句依次拼接完整。


 

第二步

PREPARE pr1 FROM @c_ExecSqlFinally;

 

第三步

EXECUTE  pr1; # 最終執行語句
DEALLOCATE PREPARE pr1 ; # 釋放資源

 

 

注意:  使用預處理語句時  要使用的是  【用戶變量】(使用SET @xxx = xxxx 方式聲明 )  不同於局部變量 (DECLARE 定義的變量)。


免責聲明!

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



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