mysql 5.7 存储过程的定义
最近做统计报表,一个数据展示,需要查询mysql,但是如果使用left join 这种语句发现太麻烦了
还是写存储过程吧
之前发过几篇文章编写存储过程,但是真的运行起来发现有各种各样的问题
所以今天也算是巩固也算是对新的坑的一个填补
相关文章:https://blog.csdn.net/datouniao1/article/details/79315198
存储过程结构定义
这样写对吗:
DROP PROCEDURE IF EXISTS PR_SLV;
CREATE PROCEDURE PR_SLV()
BEGIN
DECLARE myday varchar(32);
END;
一个最为简单的,我们运行查看:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3
这样的一个错误,我检查我的语句发现没有问题啊
第三行,定义一个变量,怎么会出现问题
原因我们定义的时候需要告诉mysql 上面执行的语句是一体的 是一个存储过程
怎么告诉mysql
DROP PROCEDURE IF EXISTS PR_SLV;
delimiter //
CREATE PROCEDURE PR_SLV()
BEGIN
DECLARE myday varchar(32);
END;
//
加上上面红色框中的内网,就可以告诉mysql 我要定义一个存储过程了,这个里面的代码是一体的,你不要分开执行啊
我们再执行试一下
mysql中的三目运算
java写多了,我们中认为三目运算时这样的 :1==2?"":3
mysql 中的三目运算时这样的
IF(expr1,expr2,expr3)
expr1 是 表达式 如果为true 取值expr2 如果为false 或者为NULL 取值为 expr3
例如:
INSERT INTO hx_bigdata_pie(pname,pvalue,porder,ptype,addtime,ptaxno) values(right(myday,5),IF(myjshj,myjshj,'0'),IF(myhjse,myhjse,'0'),'lastten',CURDATE(),ptaxno);
mysql 中字符串截取
right(str,length) left(str,length)
right 从右边开始 取出长度为length的字符串
left 从左边开始 取出长度为length的字符串
MYsql当前日期
CURDATE()
日期减:Date_sub(CURDATE(),INTERVAL id DAY)
最终存储过程如下:
DROP PROCEDURE IF EXISTS PR_MULTI;
delimiter //
CREATE PROCEDURE PR_MULTI(ptaxno VARCHAR(50))
BEGIN
DECLARE myday varchar(32);
DECLARE myjshj varchar(32);
DECLARE myhjse varchar(32);
DECLARE myse varchar(32);
DECLARE done INT DEFAULT FALSE;
DECLARE myCursor CURSOR FOR (select Date_sub(CURDATE(),INTERVAL id DAY) as dates from hx_row limit 7);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
delete from hx_bigdata_pie where ptype='lastten';
OPEN myCursor;
myLoop: LOOP
FETCH myCursor into myday;
IF done=1 THEN
LEAVE myLoop; -- 结束循环
END IF;
select sum(jshj) into myjshj from hx_main where DATE_FORMAT(kpdate,'%Y-%m-%d')=myday and xsh_taxno=ptaxno;
select sum(hjse) into myhjse from hx_main where DATE_FORMAT(kpdate,'%Y-%m-%d')=myday and xsh_taxno=ptaxno;
INSERT INTO hx_bigdata_pie(pname,pvalue,porder,ptype,addtime,ptaxno) values(right(myday,5),IF(myjshj,myjshj,'0'),IF(myhjse,myhjse,'0'),'lastten',CURDATE(),ptaxno);
END LOOP myLoop; -- 结束自定义循环体
CLOSE myCursor;
select * from hx_bigdata_pie where ptype='lastten' order by id desc limit 7;
END;
//
总结: 上面是对存储过程的应该注意的点,以及新了解到的知识的一个记录
希望对你有所帮助