
delimiter // create procedure fix_position() begin declare t mediumint(8); declare b mediumint(8); declare c mediumint(8); DECLARE thread_id CURSOR FOR select tid from pre_forum_thread; open threadid; myloop: LOOP fetch thread_id into t; SELECT count(*) into b FROM pre_forum_post WHERE tid=t; set c= b - 1; UPDATE pre_forum_thread SET replies= c WHERE tid=t; UPDATE pre_forum_thread SET maxposition=b WHERE tid=t; END LOOP; CLOSE thread_id; end;// DELIMITER ; discuz 的数据库,重新计算回复的次数然后更新到 pre_forum_thread 表, 只要执行就会报 Out of range value for column 'replies' at row 1 对 mysql 没啥研究,这还是根据网上资料现学的。。请问应该怎么修改? 感谢
1 Nicoco 2019-04-05 21:40:41 +08:00 还有胆子大,敢写存储过程的…… |
4 dobelee 2019-04-05 22:26:26 +08:00 via Android 闻到了一股火药味。boom ! |
5 caqiko 2019-04-05 22:32:55 +08:00 游标打开了吗亲? open thread_id |
6 Dragonish3600 OP @caqiko 打开了,主楼里是笔误 |
7 ra1983 2019-04-05 22:44:22 +08:00 via Android @Nicoco 不用脑补,维护过超过 5000 行的存储过程。 只能说现在互联网行业的程序员太膨胀了,自己没见过的东西就是不合理的 |
8 caqiko 2019-04-05 22:55:36 +08:00 @ladypxy #6 直接看报错 Out of range value for column 'replies' at row 1 可能是字段 replies 的类型和长度的问题。 我看这个 SP 是没问题啊。手动查一条试试看,会不会有问题? |
9 weizhen199 2019-04-05 23:06:49 +08:00 |
10 blless 2019-04-05 23:09:50 +08:00 via Android @ra1983 存储过程主要很多计算都集中在数据库里运算…,而且相当于用 sql 语言编程,sql 就那几个特性…基本等同于过程式编程。不是说见识少,维护性就是渣。人员流动几次就直接 boom |
11 caqiko 2019-04-05 23:18:25 +08:00 @caqiko #8 No data - zero rows fetched, selected, or processed 这种问题,可能是没有加 HANDLER,我还没遇到过。 参考: https://blog.csdn.net/codegallery/article/details/14384963 |
12 ra1983 2019-04-05 23:36:43 +08:00 via Android @blless 所谓的维护性是渣是建立在复杂的业务逻辑上的。 现在的互联网行业,难度在于总体架构,而不是业务复杂度。访问压力大,而单次访问的业务很简单。以某些行业的业务复杂度,按互联网行业的跳槽频率,根本没有办法维护了,业务还没理解透人就跳槽了。 |
13 neoblackcap 2019-04-06 02:34:56 +08:00 @ra1983 存储过程的确有很大的,各类金融系统里面多得是。不过我有一件想请教,排除旧系统维护的缘故。新的业务有必要使用存储过程吗? |
14 ra1983 2019-04-06 03:05:08 +08:00 via Android |
15 singer 2019-04-06 10:35:14 +08:00 via Android |
16 lsido 2019-04-06 16:24:44 +08:00 via iPhone 接过一个菠菜业务,开奖派奖全用存储过程做,一点都不友好 |