mysql存储过程及常见问题,mysql存储过程实例


需求:当月购买的秤数量

分析:表里要有两个字段,日期(YYYY-MM)、秤数量;从相关表中获取这两个字段,设置时间;建立事件,调用存储过程

1.建表

drop table `rate_a`

create table `rate_a`(
`id` int(11) not null auto_increment,
`date_a` date default null,
`num_a`  int(11) default "0",
PRIMARY key(`id`),
key `date_a`(`date_a`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;


注意字段的类型:date就是YYYY-MM-DD 如果插入的数据不符合,就返回为0 

2.建立存储过程

CREATE DEFINER=`bianla_xujh`@`localhost` PROCEDURE `rate_a`(IN current_t DATE)
BEGIN
	SET @date:= DATE_ADD(current_t,INTERVAL -1 MONTH),
    @date_f:= DATE_FORMAT(@date,'%Y-%m-01 00:00:00'),
    @date_t:= DATE_FORMAT(Last_DAY(@date),'%Y-%m-%d 23:59:59');
DELETE FROM `rate_a` WHERE date_a=date_format(@date,'%Y-%m');
INSERT INTO `rate_a`(`date_a`,`num_a`)
SELECT
    aa.date_a,
    aa.num_a
FROM
   (
        SELECT
            date_format(a.created,'%Y-%m-%d') as date_a,
            count( DISTINCT a.buyer_user_id ) AS num_a 
        FROM
            bianla_warespage_order AS a 
        WHERE
            STATUS IN ( 10, 20 ) # 10,20 代表购买
            AND created BETWEEN @date_f 
            AND @date_t 
        ) AS aa;
END

3.建立事件

begin

call rate_a('2019-01-01');

end

时间的设置在 计划 中

要明白自己写的逻辑,从逻辑的最开始找问题,一步一步排查(从一大堆代码中根据自己的思路流程,一点一点排查),结合报错信息,可以更快捷;如果没有报错,那就是自己的思维漏洞,一定要仔细筛选

问题:1.由于在第二步中我们有 变量,所以要在里面给变量赋值,注意变量 的类型,对于日期要加 ’ ’

1.确保自己有建立存储,事件的权限
2.确保事件是开着的
3.若表已经存在,先删除表
4.建立表,注意类型,自增主键等等
5.建立存储过程:里面包含查询、插入、时间、变量等语句

  • 要先测试查询语句是正确的
  • 插入表中的字段名要保证顺序,名称一致
  • 一般我们都是设置时间为变量,
  • 删除语句要有条件,一般都是我们设置的时间变量,也就是我们插入不成功时,要删除的那一条记录;如果没有条件会进行全表清空。
  • Unknown column 'num_1' in 'field list' 一般是 要插入的字段名与表里面的字段名不一致,要检查表名
  • 插入不成功时,要看是否有权限,是否开了事件,字段名是否一致
文章最后发布于: 2019-10-24 17:29:27

相关内容

    暂无相关文章