首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL-8中创建存储过程

在MySQL-8中创建存储过程
EN

Database Administration用户
提问于 2020-04-21 11:00:07
回答 1查看 772关注 0票数 0

我正在尝试创建一个SP,它将在一个表中的大约1亿行上运行批处理更新。我为它创建了下面的SP:

代码语言:javascript
复制
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 // 

它给出了下面的误差>>

代码语言:javascript
复制
    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

奇怪的是,我能够在MySQL5.6中创建SP,但只在MySQL-8中失败。有人能告诉我我错过了什么吗?谢谢

EN

回答 1

Database Administration用户

回答已采纳

发布于 2020-04-26 01:18:31

要么始终使用autocommit=1,要么使用BEGINCOMMIT

而且,一旦设置完毕,就不需要再次设置autocommit

因此,摆脱COMMIT并将SET从循环中移出。

在此proc处于休眠状态时,是否有其他进程更改is_summarized的值?我怀疑你的技巧是否能正确地抓住所有的边缘情况。

不要使用声明的rows,而是使用变量:@rows。它不需要是DECLAREd

proc的大部分线路可以从循环中提取出来。(然而,这并没有什么区别。)

至于ROWS --大多数主要版本和一些次要版本都引入了新的关键字。ROWS显然是在5.6到8.0之间添加的。我用下划线为存储过程中的存储过程和声明变量前缀任何参数,从而避免了一些这样的错误。此约定还有助于避免变量和列名之间的混淆。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/265494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档