背景:一個定時執行的存儲過程中需要用到分表的數據,需要根據當前執行時間確定要查詢哪個表的數據。
預處理語句語法如下:
# 第一種使用方式: 使用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 定義的變量)。
