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 |
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
接过一个菠菜业务,开奖派奖全用存储过程做,一点都不友好
|