Mysql
在 MySQL-8 中創建儲存過程
我正在嘗試創建一個 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
通篇使用,要麼使用BEGIN
andCOMMIT
。而且,一旦設置,您無需
autocommit
再次設置。因此,擺脫
COMMIT
並移出SET
循環。其他程序是否會
is_summarized
在此 proc 處於睡眠狀態時更改其值?我懷疑您的技術是否能正確捕捉所有邊緣情況。不要使用聲明的
rows
,而是使用變數:@rows
。它不需要是DECLAREd
。proc 的大部分行都可以被拉出循環。(但是,這並沒有什麼區別。)
至於
ROWS
——大多數主要版本和一些次要版本都引入了新的關鍵字。ROWS
顯然是在 5.6 和 8.0 之間添加的。我通過在儲存過程的任何參數前加上下劃線來避免*一些此類錯誤,並在儲存過程中聲明的變數。*此約定還有助於避免變數和列名之間的混淆。