Mysql存储过程中临时表的建立及游标遍历

最近在做公司月报表的时候出现了一个很让人为难的问题,查询一个支付的过程,内容如下:

两个表:

支付记录表A,支付日志表B

A表内容如下:

点击查看原图

B表内容如下:

点击查看原图

现在要做的事把A表中的记录关联到B表中字段operate每次checkNo操作的最后一步,当然,这个用程序实现是一个小儿科的事,可是我最也是脑子发热,偏偏只想用sql来实现,在两天研究中终于是实现了。

用到的方法主要有两个,一个是游标的遍历和临时表插入查询

实现代码如下:

 
  
  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `Jfind`(StartTime DateTime,EndTime DateTime) 
  2. BEGIN 
  3. DECLARE  r int;  
  4.      
  5.     DECLARE Done    INT DEFAULT 0; 
  6.     DECLARE RCode int(3) DEFAULT 0; 
  7.     DECLARE Sid varchar(32); 
  8.     DECLARE SphoneNumber varchar(10); 
  9.     DECLARE ScutPaymentDate datetime; 
  10.     DECLARE Smoney double(10,2); 
  11.     DECLARE SisCutPaymentSucceed  int(2); 
  12.     DECLARE ScheckNO  varchar(32); 
  13.     DECLARE SipAddress  varchar(20); 
  14.      
  15.     /*建立游标*/ 
  16.     DECLARE rs CURSOR FOR SELECT * FROM A where cutPaymentDate> STR_TO_DATE(StartTime,'%Y-%m-%d %H:%i:%s') and cutPaymentDate<STR_TO_DATE(EndTime,'%Y-%m-%d %H:%i:%s') ; 
  17.     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1; 
  18.  
  19.     /*创建临时表*/ 
  20.     DROP TABLE IF EXISTS `tmp_paymentReport`; 
  21.     CREATE TEMPORARY TABLE `tmp_paymentReport` (  
  22.         `id` varchar(32) NOT NULL, 
  23.         `phoneNumber` varchar(10) NOT NULL, 
  24.         `cutPaymentDate` datetime NOT NULL, 
  25.         `money` double(10,2) NOT NULL default '0.00', 
  26.         `isCutPaymentSucceed` int(2) NOT NULL, 
  27.         `checkNO` varchar(32) NOT NULL, 
  28.         `ipAddress` varchar(20) NOT NULL, 
  29.         `returnCode` int(3) NOT NULL, 
  30.         PRIMARY KEY  (`ID`) 
  31.         )  TYPE = HEAP; 
  32.  
  33.  
  34.     OPEN rs; /*开启游标*/ 
  35.      
  36.     FETCH NEXT FROM rs INTO Sid,SphoneNumber,ScutPaymentDate,Smoney,SisCutPaymentSucceed,ScheckNO,SipAddress; 
  37.  
  38.     REPEAT 
  39.         IF NOT Done THEN 
  40.  
  41.             SELECT `returnCode`  into RCode from `B` where `checkNO`=ScheckNO order by `operate` desc limit 0,1; 
  42.              
  43.                     INSERT INTO `tmp_paymentReport` set `id`=Sid,`phoneNumber`=SphoneNumber,`cutPaymentDate`=ScutPaymentDate,`money`=Smoney,`isCutPaymentSucceed`=SisCutPaymentSucceed,`checkNO`=ScheckNO,`ipAddress`=SipAddress,`returnCode`=RCode; 
  44.              
  45.              FETCH NEXT FROM rs INTO Sid,SphoneNumber,ScutPaymentDate,Smoney,SisCutPaymentSucceed,ScheckNO,SipAddress; 
  46.             END IF;      
  47.     UNTIL Done END REPEAT; 
  48.     CLOSE rs; 
  49.      
  50.     set @RunSQL = "select *  from tmp_paymentReport"; 
  51.     prepare smtm from @RunSQL; 
  52.     execute smtm;    
  53.      
  54. END 

调用方法是:

 
  
  1. call Jfind('2011-06-01 00:00:00','2011-07-01 00:00:00'); /*查询六月的记录*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值