› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
Dragonish3600
V2EX  ›  MySQL

mysql 存储过程求助

  •  
  •   Dragonish3600 · Apr 5, 2019 · 6242 views
    This topic created in 2741 days ago, the information mentioned may be changed or developed.
    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 没啥研究,这还是根据网上资料现学的。。请问应该怎么修改? 感谢

    Supplement 1  ·  Apr 5, 2019
    补充,
    试了下似乎是这一句有问题

    UPDATE pre_forum_thread SET replies= c WHERE tid=t;

    难道是上面 set 的赋值会出错?
    Supplement 2  ·  Apr 5, 2019
    发现如果单独执行
    '''
    SELECT count(*) into b FROM pre_forum_post WHERE tid=t;
    UPDATE pre_forum_thread SET maxposition=b WHERE tid=t;
    '''
    会返回 No data - zero rows fetched, selected, or processed
    16 replies  •  2019-04-06 16:24:44 +08:00
    Nicoco
        1
    Nicoco  
       Apr 5, 2019
    还有胆子大,敢写存储过程的……
    Lipoic
        2
    Lipoic  
       Apr 5, 2019 via Android
    @Nicoco 请教大佬为啥不能用存储过程
    Nicoco
        3
    Nicoco  
       Apr 5, 2019
    @Lipoic 你写的这些简单业务,问题不大;随着业务发展,存储过程膨胀,膨胀到成百上千行…… 可以脑补一下
    dobelee
        4
    dobelee  
       Apr 5, 2019 via Android
    闻到了一股火药味。boom !
    caqiko
        5
    caqiko  
       Apr 5, 2019
    游标打开了吗亲?
    open thread_id
    Dragonish3600
        6
    Dragonish3600  
    OP
       Apr 5, 2019 via iPhone
    @caqiko 打开了,主楼里是笔误
    ra1983
        7
    ra1983  
       Apr 5, 2019 via Android
    @Nicoco 不用脑补,维护过超过 5000 行的存储过程。
    只能说现在互联网行业的程序员太膨胀了,自己没见过的东西就是不合理的
    caqiko
        8
    caqiko  
       Apr 5, 2019
    @ladypxy #6
    直接看报错 Out of range value for column 'replies' at row 1
    可能是字段 replies 的类型和长度的问题。

    我看这个 SP 是没问题啊。手动查一条试试看,会不会有问题?
    weizhen199
        9
    weizhen199  
       Apr 5, 2019
    @Nicoco
    都是看业务需求的
    我这里有个最多 1w 行,450 个 sp,超过 2k 行的有 150+个,一跑跑三天的程序了解下
    blless
        10
    blless  
       Apr 5, 2019 via Android
    @ra1983
    存储过程主要很多计算都集中在数据库里运算…,而且相当于用 sql 语言编程,sql 就那几个特性…基本等同于过程式编程。不是说见识少,维护性就是渣。人员流动几次就直接 boom
    caqiko
        11
    caqiko  
       Apr 5, 2019
    @caqiko #8

    No data - zero rows fetched, selected, or processed 这种问题,可能是没有加 HANDLER,我还没遇到过。
    参考: https://blog.csdn.net/codegallery/article/details/14384963
    ra1983
        12
    ra1983  
       Apr 5, 2019 via Android
    @blless

    所谓的维护性是渣是建立在复杂的业务逻辑上的。
    现在的互联网行业,难度在于总体架构,而不是业务复杂度。访问压力大,而单次访问的业务很简单。以某些行业的业务复杂度,按互联网行业的跳槽频率,根本没有办法维护了,业务还没理解透人就跳槽了。
    neoblackcap
        13
    neoblackcap  
       Apr 6, 2019
    @ra1983 存储过程的确有很大的,各类金融系统里面多得是。不过我有一件想请教,排除旧系统维护的缘故。新的业务有必要使用存储过程吗?
    ra1983
        14
    ra1983  
       Apr 6, 2019 via Android
    @neoblackcap

    业务系统里面也开始减少存储过程了
    但是 BI 里还是大量使用
    singer
        15
    singer  
    PRO
       Apr 6, 2019 via Android
    lsido
        16
    lsido  
       Apr 6, 2019 via iPhone
    接过一个菠菜业务,开奖派奖全用存储过程做,一点都不友好
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2528 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 14:45 · PVG 22:45 · LAX 07:45 · JFK 10:45
    ♥ Do have faith in what you're doing.