• 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'); /*查询六月的记录*/
  • 相关阅读:
    莫比乌斯反演学习笔记
    NOIp 2020 游记
    题解【LOJ3087】「GXOI / GZOI2019」旅行者
    题解【CF999E】Reachability from the Capital
    题解【LOJ2007】「SCOI2015」国旗计划
    题解【LOJ3145】「APIO2019」桥梁
    题解【LOJ2114】「HNOI2015」菜肴制作
    CSP-J/S 2020 爆炸记
    题解【洛谷P2569】[SCOI2010]股票交易
    补题目录
  • 原文地址:https://www.cnblogs.com/shihao/p/2162223.html
Copyright © 2020-2023  润新知