`
zqjshiyingxiong
  • 浏览: 440430 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

MYSQL每日一用:存储过程

    博客分类:
  • DB
阅读更多

 

今天要做一个统计报表,想到使用存储过程来做。

 

mysql的存储过程以前没有用过,这次想试试,在编写的过程中遇到了不少问题:

 

首先,看了官方的文档 ,不过对于存储过程,还是要使用才知道。文档是死的,人是活的。

 

1.怎么创建存储过程,自然也是使用一定语法,然后运行,如果成功,会有一个对应的文

 

件产生,并可以通过 call 来调用。

 

2.设定变量要注意,不是全局变量(@)时,要先定义(DECLARE year_months VARCHAR(10))

 

3.设置变量时的语法,在变量前面加 SET 关键字,不然报错

 

4.直接执行SQL,是可以的,但是如果我们的SQL是动态的,比如我们表名是通过参数传进来的。

 

这时间要另外一种方式了,要将sql,使用CONCAT(,,,),来讲sql连接起来。还有就是字符串拼接时,

 

最好使用CONCAT(见下面的)函数,不然会有问题。

 

下面是我写的一个实例:

 

DROP   PROCEDURE  IF   EXISTS   `crm_sms_stat`;

CREATE DEFINER=`boss`@`%` PROCEDURE `crm_sms_stat`(IN years varchar(10),IN m varchar(10),IN last_months varchar(10))
BEGIN
     DECLARE year_months VARCHAR(10);
     DECLARE year_m VARCHAR(10);
     DECLARE mt_sms_yearmonth VARCHAR(20);
     DECLARE r_year_month VARCHAR(20);
     DECLARE last_r_year_month VARCHAR(20);
    
    
     SET year_months = CONCAT(years,m);
     SET year_m = CONCAT(years,'-',m);
     SET mt_sms_yearmonth = CONCAT("mt_sms_",year_months);
     SET r_year_month = CONCAT(years,"_",m);
    
     IF m = "01" THEN
        SET years = years - 1;
        SET last_months = "12";
     END IF;
     SET last_r_year_month = CONCAT(years,"_",last_months);
    
     IF years = "2008" THEN
        SET r_year_month = CONCAT("R",r_year_month);
        SET last_r_year_month = CONCAT("R",last_r_year_month);
     END IF;
    
    
     /*---------------------------------------------------------------- */
     SET @insertStat = CONCAT(' INSERT INTO crm_sms_stat(months,user_id,username,agentid) ',
                              ' select "',year_months,'",u.user_id,u.username,u.agentid from ',mt_sms_yearmonth,
                              ' mt inner join users u on mt.user_id=u.user_id group by mt.user_id ');
     PREPARE insertS FROM @insertStat;
     EXECUTE insertS;
    
    
     SET @tempupdateRemain = CONCAT(' UPDATE crm_monthRemain cm,crm_sms_stat css SET css.last_remain = ifnull(',
                                     last_r_year_month,',0),css.this_remain = ifnull(', r_year_month,',0) ',
                                     ' WHERE cm.id = css.user_id and css.months = "',year_months,'" ');
     PREPARE remain FROM @tempupdateRemain;
     EXECUTE remain;
   
     -- 更新每个月用户所冲条数
     SET @tempadd = CONCAT(' UPDATE crm_sms_stat css inner join (select name,sum(total_count) addNum from boss_addmoney  ',
                           ' where left(add_date,7)= "',year_m,'" and total_count >=0 and name not like "%=%" and name not like "%:%" group by name) ',
                           ' x on css.username= x.name and css.months = "',year_months ,'" ',
                           ' SET css.add_num = ifnull(x.addNum,0) ');
     PREPARE addnum FROM @tempadd;
     EXECUTE addnum;
            
                  
            
       
     IF years = "08" THEN
        -- 更新通道发送数(200901之前是不分卡发和通道的)
        SET @tempChannel08 = CONCAT('UPDATE crm_sms_stat css inner join (select mt.user_id,',
                                       ' sum(length(replace(mt.dest_mobile,";","")))/11  chennel_num',
                                       ' from ',mt_sms_yearmonth,' mt ',
                                       ' group by mt.user_id) x on css.user_id = x.user_id and css.months = "',year_months,'"',
                                       ' set css.channel_num = ifnull(x.chennel_num,0) ');
       
        PREPARE channel08 FROM @tempChannel08;
        EXECUTE channel08; 
     ELSE
         -- channel send number
         SET @tempChannel = CONCAT('UPDATE crm_sms_stat css inner join (select mt.user_id,',
                                       ' sum(length(replace(mt.dest_mobile,";","")))/11  chennel_num',
                                       ' from ',mt_sms_yearmonth,' mt WHERE mt.channel_id != 312 ',
                                       ' group by mt.user_id) x on css.user_id = x.user_id and css.months = "',year_months,'"',
                                       ' set css.channel_num = ifnull(x.chennel_num,0) ');
       
         PREPARE channel FROM @tempChannel;
         EXECUTE channel; 
         -- card send number    
         SET @tempcard = CONCAT('UPDATE crm_sms_stat css inner join (select mt.user_id,',
                                   ' sum(SUBSTRING_INDEX(SUBSTRING_INDEX(mt.dest_mobile, "real", 1),":",-1)) as submit_card_num,',
                                   ' sum(SUBSTRING_INDEX(mt.dest_mobile,":",-1)) as real_card_num',
                                   ' from ',mt_sms_yearmonth,' mt WHERE mt.channel_id = 312 ',
                                   ' group by mt.user_id) x on css.user_id = x.user_id and css.months = "',year_months,'"',
                                   ' set css.submit_card_num = ifnull(x.submit_card_num,0),css.real_card_num = ifnull(x.real_card_num,0) ');
         PREPARE card FROM @tempcard;
         EXECUTE card; 
     END IF;    
    
END;

分享到:
评论

相关推荐

    深入mysql存储过程中表名使用参数传入的详解

    在MySQL数据库中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作。在特定场景下,我们可能需要动态创建或操作表,这时表名作为参数传递到存储过程内就显得非常实用。本文将深入讲解如何在MySQL...

    MySQL数据库应用 实验训练4:视图和索引的构建与使用

    MySQL数据库中的视图和索引是两个非常重要的概念,它们对于数据管理、查询效率和数据安全性都有着显著的影响。本实验训练旨在让学生通过实际操作来深入理解这两个概念。 首先,我们来看视图。视图可以被看作是...

    job调用的存储过程

    存储过程则是一组预编译的SQL语句集合,封装了特定的功能,供应用程序或数据库管理员调用。 在Oracle、SQL Server、MySQL等数据库系统中,都有内置的调度服务或工具来创建和管理job。例如,Oracle的DBMS_SCHEDULER...

    MySQL数据库备份和恢复

    - **InnoDB表**:所有数据存储在一个或多个共享的文件中,备份复杂度较高,推荐使用二进制日志备份或mysqldump进行逻辑备份。 #### 最佳实践 1. **定期备份**:根据业务需求制定合理的备份策略,如每日、每周或每...

    mysql数据库备份下

    MySQL数据库是世界上最受欢迎的开源关系型数据库管理系统之一,它提供了高效的数据存储和管理能力。在IT行业中,数据库备份是一项至关重要的任务,确保数据的安全性和可恢复性。标题“mysql数据库备份下”指的是对...

    C#连MySQL所需DLL.zip

    除了基本的连接和查询,`MySql.Data.dll`还提供了处理事务、预编译语句、存储过程调用等功能,使得C#开发者能够全面地利用MySQL数据库的能力。 在实际项目中,为了确保兼容性和稳定性,开发者应该选择与MySQL服务器...

    python自动备份mysql数据库,并删除七天前文件

    本示例涉及的主题是使用Python来自动备份MySQL数据库,并且定期清理过期的备份文件,以保持存储空间的有效利用。下面将详细介绍这个过程以及相关的知识点。 首先,我们需要了解Python在数据库操作中的角色。Python...

    mysql计划任务教程.zip_mysql下载完是个压缩包

    在MySQL中,计划任务通常被称为事件(Event),它们允许用户根据预设的时间表执行特定的SQL语句或存储过程。这些任务可以是每日、每周、每月执行一次,甚至可以设置更为复杂的触发条件。这种特性对于定期备份、数据...

    mysql 实现定时给表追加分区

    实现mysql 每天定时自动给数据库表追加分区,包含存储计划和存储过程

    如何在linux下实现mysql数据库每天自动备份 txt

    在Linux环境下进行MySQL数据库的日常自动备份是一项重要的维护工作,它能够确保数据的安全性与完整性。本文将详细介绍如何通过编写Shell脚本并结合Cron定时任务来实现MySQL数据库的每日自动备份。 #### 一、准备...

    PHP+MySQL投票系统

    PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,特别适合于Web开发,可嵌入到HTML中。在投票系统中,PHP主要负责以下几方面: 1. **页面动态生成**:PHP可以生成动态网页,根据用户请求实时生成投票...

    Veeam Agent for Linux and mysql 安装说明

    在IT领域,尤其是在服务器管理和数据保护方面,Veeam Agent for Linux和MySQL的结合使用是至关重要的。Veeam Agent是一款高效的数据备份解决方案,专为Linux操作系统设计,而MySQL是广泛应用的关系型数据库管理系统...

    尚硅谷MySQL基础每日单词1

    9. **port**:计算机端口是进行网络通信的逻辑通道,例如,MySQL默认使用3306端口。 10. **localhost**:指本地计算机或服务器,常用于测试和开发环境。 11. **show**:在MySQL中,show命令用于显示数据库、表、...

    万年历系统mysql数据库设计.zip

    本项目采用MySQL作为数据库管理系统,它是一款广泛使用的开源关系型数据库,以其稳定性、性能和易用性著称。下面将详细介绍如何为万年历系统设计MySQL数据库。 1. **基础表设计**: - **日历表**:存储公历日期,...

    MySQLBackupFTP及注册工具

    3. 压缩备份:备份过程会将数据库文件压缩,节省存储空间,同时提高传输效率。 4. FTP上传:备份文件可以通过FTP协议上传到远程服务器,提供额外的数据冗余和灾难恢复策略。 5. 邮件通知:备份完成后,系统会自动...

    MySql安装指南-英文版

    MySQL是一款广泛使用的开源关系型数据库管理系统,在多种操作系统上都有良好的表现。自MySQL 3.21版本起,原生Windows版本便已发布,并占据了每日下载量的重要部分。对于希望在Windows平台上部署MySQL的用户来说,本...

    mysql自动备份工具

    恢复过程通常通过MySQL命令行客户端或图形用户界面工具(如MySQL Workbench)完成,使用`SOURCE`命令或者导入功能来执行.sql文件中的SQL语句。 为了实现自动化备份,工具通常会使用操作系统任务调度器(例如Windows...

    mysql8备份-centos8.zip

    MySQL 8.0是当前最流行的关系型数据库管理系统之一,尤其在Linux环境下,它被广泛应用于数据存储和管理。在CentOS 8操作系统上,备份MySQL数据库是非常关键的任务,以确保数据安全,防止意外丢失。这个名为"mysql8...

    mysql 自动备份数据库脚本

    4. **备份策略**:自动备份不仅需要考虑何时执行,还应考虑备份的频率(如每日、每周或每月一次)、保留多少个历史备份、全量备份与增量备份的结合等。全量备份是完整数据库的拷贝,而增量备份仅备份自上次备份以来...

    javaweb-mysql day19每日作业卷1

    - SQLyog是一个常见的MySQL图形化管理工具,安装过程简单,双击安装后,通过配置连接参数可以连接到MySQL数据库,方便进行可视化操作。 4. **SQL语句的分类**: - DDL(Data Definition Language):数据定义语言...

Global site tag (gtag.js) - Google Analytics