今天要做一个统计报表,想到使用存储过程来做。
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数据库中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作。在特定场景下,我们可能需要动态创建或操作表,这时表名作为参数传递到存储过程内就显得非常实用。本文将深入讲解如何在MySQL...
MySQL数据库中的视图和索引是两个非常重要的概念,它们对于数据管理、查询效率和数据安全性都有着显著的影响。本实验训练旨在让学生通过实际操作来深入理解这两个概念。 首先,我们来看视图。视图可以被看作是...
存储过程则是一组预编译的SQL语句集合,封装了特定的功能,供应用程序或数据库管理员调用。 在Oracle、SQL Server、MySQL等数据库系统中,都有内置的调度服务或工具来创建和管理job。例如,Oracle的DBMS_SCHEDULER...
- **InnoDB表**:所有数据存储在一个或多个共享的文件中,备份复杂度较高,推荐使用二进制日志备份或mysqldump进行逻辑备份。 #### 最佳实践 1. **定期备份**:根据业务需求制定合理的备份策略,如每日、每周或每...
MySQL数据库是世界上最受欢迎的开源关系型数据库管理系统之一,它提供了高效的数据存储和管理能力。在IT行业中,数据库备份是一项至关重要的任务,确保数据的安全性和可恢复性。标题“mysql数据库备份下”指的是对...
除了基本的连接和查询,`MySql.Data.dll`还提供了处理事务、预编译语句、存储过程调用等功能,使得C#开发者能够全面地利用MySQL数据库的能力。 在实际项目中,为了确保兼容性和稳定性,开发者应该选择与MySQL服务器...
本示例涉及的主题是使用Python来自动备份MySQL数据库,并且定期清理过期的备份文件,以保持存储空间的有效利用。下面将详细介绍这个过程以及相关的知识点。 首先,我们需要了解Python在数据库操作中的角色。Python...
在MySQL中,计划任务通常被称为事件(Event),它们允许用户根据预设的时间表执行特定的SQL语句或存储过程。这些任务可以是每日、每周、每月执行一次,甚至可以设置更为复杂的触发条件。这种特性对于定期备份、数据...
实现mysql 每天定时自动给数据库表追加分区,包含存储计划和存储过程
在Linux环境下进行MySQL数据库的日常自动备份是一项重要的维护工作,它能够确保数据的安全性与完整性。本文将详细介绍如何通过编写Shell脚本并结合Cron定时任务来实现MySQL数据库的每日自动备份。 #### 一、准备...
PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,特别适合于Web开发,可嵌入到HTML中。在投票系统中,PHP主要负责以下几方面: 1. **页面动态生成**:PHP可以生成动态网页,根据用户请求实时生成投票...
在IT领域,尤其是在服务器管理和数据保护方面,Veeam Agent for Linux和MySQL的结合使用是至关重要的。Veeam Agent是一款高效的数据备份解决方案,专为Linux操作系统设计,而MySQL是广泛应用的关系型数据库管理系统...
9. **port**:计算机端口是进行网络通信的逻辑通道,例如,MySQL默认使用3306端口。 10. **localhost**:指本地计算机或服务器,常用于测试和开发环境。 11. **show**:在MySQL中,show命令用于显示数据库、表、...
本项目采用MySQL作为数据库管理系统,它是一款广泛使用的开源关系型数据库,以其稳定性、性能和易用性著称。下面将详细介绍如何为万年历系统设计MySQL数据库。 1. **基础表设计**: - **日历表**:存储公历日期,...
3. 压缩备份:备份过程会将数据库文件压缩,节省存储空间,同时提高传输效率。 4. FTP上传:备份文件可以通过FTP协议上传到远程服务器,提供额外的数据冗余和灾难恢复策略。 5. 邮件通知:备份完成后,系统会自动...
MySQL是一款广泛使用的开源关系型数据库管理系统,在多种操作系统上都有良好的表现。自MySQL 3.21版本起,原生Windows版本便已发布,并占据了每日下载量的重要部分。对于希望在Windows平台上部署MySQL的用户来说,本...
恢复过程通常通过MySQL命令行客户端或图形用户界面工具(如MySQL Workbench)完成,使用`SOURCE`命令或者导入功能来执行.sql文件中的SQL语句。 为了实现自动化备份,工具通常会使用操作系统任务调度器(例如Windows...
MySQL 8.0是当前最流行的关系型数据库管理系统之一,尤其在Linux环境下,它被广泛应用于数据存储和管理。在CentOS 8操作系统上,备份MySQL数据库是非常关键的任务,以确保数据安全,防止意外丢失。这个名为"mysql8...
4. **备份策略**:自动备份不仅需要考虑何时执行,还应考虑备份的频率(如每日、每周或每月一次)、保留多少个历史备份、全量备份与增量备份的结合等。全量备份是完整数据库的拷贝,而增量备份仅备份自上次备份以来...
- SQLyog是一个常见的MySQL图形化管理工具,安装过程简单,双击安装后,通过配置连接参数可以连接到MySQL数据库,方便进行可视化操作。 4. **SQL语句的分类**: - DDL(Data Definition Language):数据定义语言...