Mysql

在 MySQL-8 中創建儲存過程

  • April 27, 2020

我正在嘗試創建一個 SP,它將對錶中的大約 1 億行執行批量更新。我為它創建了以下 SP:

delimiter //

CREATE PROCEDURE `bulk_update`(IN table_name varchar(30))
BEGIN
DECLARE rows INT;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET rows = 1;
WHILE rows > 0
do
SET autocommit=1;
SET @query =CONCAT('update ',table_name,' set is_summarized="N";');
PREPARE update_stmt FROM @query;
EXECUTE update_stmt;
SET rows = row_count();
select sleep(1); 
commit;
DEALLOCATE PREPARE update_stmt;
END WHILE;
END // 

它給出了以下錯誤>>

   ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rows INT;
   SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET rows = 1;
' at line 3

奇怪的是我能夠在 MySQL-5.6 中創建 SP,但它僅在 MySQL-8 中失敗。有人可以指出我所缺少的嗎?謝謝

要麼autocommit=1通篇使用,要麼使用BEGINand COMMIT

而且,一旦設置,您無需autocommit再次設置。

因此,擺脫COMMIT並移出SET循環。

其他程序是否會is_summarized在此 proc 處於睡眠狀態時更改其值?我懷疑您的技術是否能正確捕捉所有邊緣情況。

不要使用聲明的rows,而是使用變數: @rows。它不需要是DECLAREd

proc 的大部分行都可以被拉出循環。(但是,這並沒有什麼區別。)

至於ROWS——大多數主要版本和一些次要版本都引入了新的關鍵字。 ROWS顯然是在 5.6 和 8.0 之間添加的。我通過在儲存過程的任何參數前加上下劃線來避免*一些此類錯誤,並在儲存過程中聲明的變數。*此約定還有助於避免變數和列名之間的混淆。

引用自:https://dba.stackexchange.com/questions/265494