`
IT_way
  • 浏览: 67774 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mysql 存储过程

阅读更多
现在在做一个项目,设计到一个统计。可以不写存储过程,用程序就可以解决,但自己觉得用程序效率会慢一些,就想到了用存储过程。在书写的存储过程中用到了游标,临时表。也碰到一些问题。
-- 联系人导入统计创建存储过程
create PROCEDURE relationpepole_pro()
BEGIN
-- DECLARE x INT;
DECLARE costnum BIGINT DEFAULT 0;
DECLARE lasttime datetime;
DECLARE num int DEFAULT 0;
DECLARE rrelationpepolepk varchar(36);
DECLARE rownpoit double DEFAULT 0;
DECLARE rrpaddtime datetime;
DECLARE rrpemail varchar(30);
DECLARE rrpname varchar(20);
DECLARE rrptel varchar(13);
DECLARE rrpuserid varchar(36);
DECLARE rstatues varchar(6);
DECLARE rtelnum varchar(15);
DECLARE rbirthday datetime;
DECLARE rremail varchar(30);
DECLARE rsex varchar(6);
DECLARE rrcustomgrade varchar(36);
DECLARE rrcustormtype varchar(36);
DECLARE rraddress varchar(100);
DECLARE resutmark INT DEFAULT 0;
DECLARE tempmark INT DEFAULT 0;
DECLARE rp_cursor CURSOR FOR SELECT relationpepolepk,ownpoit,rpaddtime,rpemail,rpname,rptel,
rpuserid,statues,telnum,birthday,remail,sex,rcustomgrade,rcustormtype,raddress from relationpepole;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET resutmark = 1;
-- 删除表relationpepole_total_temp
drop table if EXISTS relationpepole_total_temp;
-- 创建relationpepole_total_temp 临时表
CREATE TEMPORARY TABLE if not EXISTS `relationpepole_total_temp` (
  `relationpepolepk` varchar(36) NOT NULL,
  `ownpoit` double NOT NULL,
  `rpaddtime` datetime NOT NULL,
  `rpemail` varchar(30) DEFAULT NULL,
  `rpname` varchar(20) NOT NULL,
  `rptel` varchar(13) DEFAULT NULL,
  `rpuserid` varchar(36) NOT NULL,
  `statues` varchar(6) DEFAULT NULL,
  `telnum` varchar(15) DEFAULT NULL,
  `birthday` datetime DEFAULT NULL,
  `remail` varchar(30) DEFAULT NULL,
  `sex` varchar(6) DEFAULT NULL,
  `rcustomgrade` varchar(36) DEFAULT NULL,
  `rcustormtype` varchar(36) DEFAULT NULL,
  `raddress` varchar(100) DEFAULT NULL,
	`rcostnum` int DEFAULT 0 NOT NULL,
  `rlasttime` datetime DEFAULT NULL,
	PRIMARY KEY (`relationpepolepk`)
);
-- 调试 set @x=3;
open rp_cursor;
REPEAT
FETCH rp_cursor INTO rrelationpepolepk,rownpoit,rrpaddtime,rrpemail,rrpname,rrptel,rrpuserid,rstatues,rtelnum,rbirthday,rremail,rsex,rrcustomgrade,rrcustormtype,rraddress;
IF (resutmark<>1)  THEN
-- 成交次数,成交时间赋值
SELECT count(orderidpk),costime into costnum,lasttime from sysorder where rpfkid=rrelationpepolepk and ostatues='normal' AND orderstatus='confirm'
and checkstate='pass' order by costime;
set @x=CONCAT(@x,costnum);
-- 插入到临时表 relationpepole_total_temp
INSERT INTO relationpepole_total_temp VALUES (rrelationpepolepk, rownpoit, rrpaddtime, rrpemail,rrpname,
rrptel,rrpuserid,rstatues,rtelnum,rbirthday, rremail, rsex, rrcustomgrade, rrcustormtype,rraddress,costnum,lasttime);
END IF;
UNTIL resutmark=1 END REPEAT;
close rp_cursor;

-- 返回结果集
SELECT relationpepolepk,ownpoit,rpaddtime,rpemail,rpname,rptel,rpuserid,statues,telnum,birthday,remail,sex,rcustomgrade,rcustormtype,raddress,rcostnum,rlasttime from relationpepole_total_temp;
end

sql的存储过程大同小异,第一个是申明一个存储过程(包括输入和输出参数),第二 创建内容 begin end
临时表的存在是在一次连接中,当连接返回到连接池是或连接销毁时,临时表就不存在了。临时表也是存在硬盘系统中。还有一种临时表存在内存中。这种临时表访问速度快,但是耗内存。具体用哪种临时表,就依情况而定。

说一下我在书写过程中遇到的问题

1.申明的变量名不要和表字段名一样

SELECT relationpepolepk,ownpoit,rpaddtime,rpemail,rpname,rptel,rpuserid,statues,telnum,birthday,remail,sex,rcustomgrade,rcustormtype,raddress,rcostnum,rlasttime from relationpepole_total_temp;
rcostnum,rlasttime原先是和申明变量名costnum,lasttime一致的,返回的时候mysql分不清你是要返回字段的值,还是申明变量的值。这时就返回申明变量的值

2 其他的变量的申明要在游标变量之前也就是游标申明放在后边
3 异常帮助书写
DECLARE CONTINUE HANDLER FOR NOT FOUND SET resutmark = 1;
这里的意思是数据查询不出 继续程序,并 给resutmark 赋值,在这里我耗费了好多时间,看的最多的是和游标一起用,游标找不到数据,就赋值,循环终止。当请仔细 是数据查不到,只要你的存储过程中有查询语句,如果查不到,就是出发这个语句。所以要注意
3 调试
在mysql里调试是很不方便,在网上找了一下也没找到什么调试工具,不过还好有这个
-- 调试 set @x=3;
通过这个方式你可以进行单步调试,虽然不怎么方便,总比没有强。
在调用存储过程后你可以通过 select @x来查看变量x的值,从而知晓过程的执行状态,进行调试

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics