现在在做一个项目,设计到一个统计。可以不写存储过程,用程序就可以解决,但自己觉得用程序效率会慢一些,就想到了用存储过程。在书写的存储过程中用到了游标,临时表。也碰到一些问题。
-- 联系人导入统计创建存储过程
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的值,从而知晓过程的执行状态,进行调试
分享到:
相关推荐
Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三...
本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...
mysql经典教程+mysql存储过程讲解 重点讲解Mysql的存储过程,触发器,游标的使用 对mysql不太熟的朋友可以好好学习。。。
c++实现调mysql存储过程,实现存储过程的出参入参,可以支持查询多数据返回,还有存储过程的复杂数据的增删改等
mysql中文手册.chm+mysql命令大全.chm+mysql存储过程.pdf
mysql存储过程实现分页 mysql存储过程实现分页 mysql存储过程实现分页 mysql存储过程实现分页
MySQL存储过程学习 MySQL存储过程 MySQL存储过程
本文实例讲述了MySQL存储过程的异常处理方法。分享给大家供大家参考。具体如下: mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc -> (p_first_name VARCHAR(30), -> p_last_name VARCHAR(30)...
MySQL存储过程编程 可以看看 数据库 存储过程
mysql存储过程ppt
mysql 存储过程 实战
MySQL存储过程
mysql获取两个时间相差年月日:使用mysql存储过程,实现计算两个时间的差值,并用年月日时分秒的格式输出,且从大到小为0时则不展示对应单位(如:相差1小时20秒 则展示'1时0分20秒')
mysql存储过程,存储函数练习,里面有详细代码,供大家参考
php中调用MySQL存储过程示例
mysql存储过程实例详细介绍了mysql存储过程的开发步骤
mysql存储过程调试工具,可以设置断点,方便查看变量信息等。好用,简单
MySQL存储过程,入门简单,循序渐进,很适合自学,很详尽,很好学。
MySQL存储过程 MySQL存储过程 MySQL存储过程 MySQL存储过程 MySQL存储过程