`
猪↘專屬|华
  • 浏览: 163992 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mysql 使用临时表以及游标返回结果集

 
阅读更多

mysql里面不可以返回游标,很让人蛋疼,没oracle好,而且,mysql没有什么好的调试工具,也比较纠结.

下面是我写的一个mysql存储过程,里面使用到了游标,临时表,最终返回的是结果接,希望对大家有帮助:

DELIMITER $$

USE `realwar`$$

DROP PROCEDURE IF EXISTS `queryRemainsPoints`$$

CREATE DEFINER=`root`@`%` PROCEDURE `queryRemainsPoints`(
    /*in startSize int,
    in pageSize int,startSize,分页的起始位置,pageSize 分页的大小,
    in queryUserName varchar(100),/*queryUserName根据用户名字来查找,
    in remainP int,
    in remainP1 INT,/*remainP 用户剩余军饷小,remainP1剩余军饷大
    in sumP int,
    IN sumP1 int, payP 用户充值总额小,payP 总金额大
    in rats int ,
    in rats1 int滞留率查询*/
    )
BEGIN
 DECLARE userNames VARCHAR(50);
 DECLARE nickName VARCHAR(50);
 DECLARE sumPoints INT;
 DECLARE remainPoint INT;
 DECLARE dayPay INT DEFAULT 0;
 DECLARE dayCost INT;
 DECLARE sumCost INT;
 DECLARE dayRemainRats VARCHAR(50);
 DECLARE sumRemainRats VARCHAR(50);
 DECLARE    over INT DEFAULT 0;
 
 /*定义一个游标,获得所有的用户*/
 /*if(queryUserName is not null){
  DECLARE usernameCur FOR SELECT rp.username AS userName FROM realwar_tool.play_money_pay_log rp where rp.username=queryUserName GROUP BY (rp.username);
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'SET userName = NULL;
 }else{
  DECLARE usernameCur CURSOR FOR SELECT rp.username AS userName FROM realwar_tool.play_money_pay_log rp GROUP BY (rp.username);
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'SET userName = NULL;*/
 
 DECLARE usernameCur CURSOR FOR SELECT rp.username  FROM realwar_tool.play_money_pay_log rp GROUP BY (rp.username);
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'SET userNames = NULL;
 
 /*创建一个临时表,用来存放数据*/
 DROP  TABLE IF EXISTS realwar.temp_remainsPoints;
 CREATE TEMPORARY TABLE realwar.temp_remainsPoints(
     sid INT(10) PRIMARY KEY AUTO_INCREMENT,
     userName1 VARCHAR(100),
     nickName1 VARCHAR(100),
     sumPoints1 INT(10),
     remainPoints1 INT(10),
     dayPay1  INT(10),
     dayCost1 INT(10),
     dayRemainRats1 VARCHAR(10),
     sumRemainRats1 VARCHAR(10)
 );
 OPEN usernameCur;/*打开游标*/
 /*usernameCur:loop */
  FETCH usernameCur INTO userNames;/*循环游标,给userName赋值*/
  WHILE(userNames IS NOT NULL) DO
    /*玩家昵称*/
    SELECT (rp.nickName) INTO nickName  FROM realwar.playbaseinfo rp WHERE rp.UserName = userNames;
    /*今日充值军饷*/
    SELECT SUM(r1.change_money)*10 INTO dayPay FROM realwar_tool.play_money_pay_log r1 WHERE r1.username=userNames AND YEAR(FROM_UNIXTIME(r1.dateline)) = YEAR(SYSDATE())
    AND MONTH(FROM_UNIXTIME(r1.dateline)) = MONTH(SYSDATE()) AND DATE(FROM_UNIXTIME(r1.dateline)) = DATE(SYSDATE());
    IF(dayPay  IS NULL) THEN
     SELECT 0 INTO dayPay FROM DUAL;
    END IF;
       
    /*用户总充值军饷或消费券*/
    SELECT SUM(r1.change_money*10) INTO sumPoints FROM realwar_tool.play_money_pay_log  r1 WHERE r1.username = userNames;
    IF (sumPoints IS NULL) THEN
     SELECT 0 INTO sumPoints FROM DUAL;
    END IF;
    
    /*今日花费军饷或消费券*/
    SELECT SUM(t1.price) INTO dayCost  FROM realwar.t_consumption t1 WHERE t1.userName = userNames  AND YEAR(STR_TO_DATE(t1.consumDate,'%Y-%m-%d %H:%i:%s')) = YEAR(SYSDATE())
    AND MONTH(STR_TO_DATE(t1.consumDate,'%Y-%m-%d %H:%i:%s')) = MONTH(SYSDATE()) AND DATE(STR_TO_DATE(t1.consumDate,'%Y-%m-%d %H:%i:%s')) = DATE(SYSDATE());
    IF (dayCost IS NULL) THEN
     SELECT 0 INTO dayCost FROM DUAL;
    END IF;
    
    
    /*用户总花费军饷或消费券*/
    SELECT SUM(t2.price) INTO sumCost FROM realwar.t_consumption t2 WHERE t2.userName = userNames;
    IF (sumCost IS NULL) THEN
     SELECT 0 INTO sumCost FROM DUAL;
    END IF;
    
    /*今日滞留*/
    IF(dayPay!=0) THEN
     SELECT FLOOR((dayPay-dayCost)/dayPay*100) INTO dayRemainRats FROM DUAL;
    ELSE
     SELECT 0 INTO dayRemainRats FROM DUAL;
    END IF;
    
    /*总滞留*/
    
    IF(sumPoints!=0)THEN
     SELECT FLOOR((sumPoints-sumCost)/sumPoints*100) INTO sumRemainRats FROM DUAL;
    ELSE
     SELECT 0 INTO sumRemainRats FROM DUAL;
    END IF;
    
    /*将得到的值,循环的插入到临时表中*/
    INSERT INTO temp_remainsPoints SET userName1=userNames,nickName1= nickName,sumPoints1= sumPoints,
    remainPoints1= (sumPoints-sumCost),dayPay1 = dayPay,dayCost1= dayCost,dayRemainRats1 = dayRemainRats,sumRemainRats1= sumRemainRats;
    FETCH usernameCur INTO userNames;/*循环游标,给userName赋值*/
 
 END WHILE;
 /*end loop;*/
 CLOSE usernameCur;
 
 /*返回的结果集*/
 SELECT userName1,nickName1,sumPoints1,remainPoints1,dayPay1,dayCost1,dayRemainRats1,sumRemainRats1
 FROM temp_remainsPoints;
    END$$

DELIMITER ;

0
0
分享到:
评论
1 楼 lobtao 2014-05-05  
返回游标,游标定位的是谁,返回谁就好了,为什么返回游标。

相关推荐

    mysql复杂存储过程实例(游标、临时表、循环、递归)

    本资源结合实例实现一个复杂的存储过程,存储过程中有用到游标、临时表、循环、递归等知识,sql文件附有实例数据表创建的sql语句。

    Oracle存储过程游标详解

    Oracle 存储过程游标是指在 Oracle 数据库中使用游标来实现对结果集的处理和操作。游标可以分为静态游标和REF游标两种类型。静态游标是指结果集已经确实(静态定义)的游标,可以进一步分为隐式游标和显示游标。隐式...

    mysql游标存储过程例子

    根据提供的文件信息,本文将详细解释一个MySQL存储过程的例子,其中包含了游标的使用。这个存储过程主要用于处理一批数据,涉及到日期范围内的数据处理、异常处理等。下面将逐一解析存储过程中涉及的重要知识点。 #...

    存储过程:利用游标+临时表实现查询

    下面我们将深入探讨存储过程的使用优势、游标的概念和使用步骤,以及在MySQL中如何实现游标。 1. 存储过程的优势: - **编译优化**:存储过程在创建时进行一次性编译,之后执行时无需再次编译,提高了数据库执行...

    sql 游标遍历 实例

    在SQL(结构化查询语言)中,游标(Cursor)是一种重要的编程工具,它允许数据库开发者按需一行一行地处理查询结果集。游标在处理大量数据时特别有用,特别是当你需要对结果集中的每一行执行不同的操作或者进行迭代...

    mysql中游标的使用案例详解(学习笔记)

    - **特点**:与普通的SELECT语句不同,游标允许用户在存储过程或函数中逐行读取结果集的数据,而不是一次性返回所有结果。 #### 二、游标的基本操作 在MySQL中使用游标涉及到几个关键步骤: **2.1 声明游标** ```...

    不使用游标完成循环功能(下)

    这种方法的核心在于使用临时表结合`WHILE`循环结构来模拟游标的行为,从而避免了游标带来的性能问题。 **具体步骤**: 1. **初始化**:首先,设置迭代变量`@i`和行计数器`@iRwCnt`,并创建临时表`#tbl`用于存放待...

    mysql的存储过程、游标 、事务实例详解

    MySQL的存储过程、游标和事务是数据库管理中非常重要的概念,它们在处理大量数据和实现复杂的业务逻辑时起着关键作用。以下是对这些概念的详细解释和实例分析。 **存储过程**: 存储过程是一组预编译的SQL语句,以...

    存储过程的返回结果集有2中类型

    这种模式下,存储过程通常会通过输出参数或者临时表来传递结果。例如,在Oracle中,可以使用OUT或IN OUT参数来返回结果。而在SQL Server中,可以通过表变量或者INSERT INTO...EXECUTE结构来实现。这种方式允许调用者...

    mysql优化——部分

    本篇文章将深入探讨两个关键的MySQL优化技术:存储过程优化和索引优化,具体为使用临时表代替游标以及巧建SUM索引来提升效率。 首先,我们来谈谈MySQL存储过程中的优化策略——使用临时表代替游标。游标在处理复杂...

    mysql存储过程优化

    本文将探讨两个重要的优化策略:使用临时表代替游标以及巧建SUM索引来提升查询效率。 首先,我们来讨论“使用临时表代替游标”。在MySQL存储过程中,游标通常用于逐行处理结果集,但这种方式在处理大数据量时可能会...

    mysql触发器,游标

    - **敏感/不敏感**:敏感游标反映实时数据变化,而不敏感游标使用数据的临时副本,不受其他事务影响。 创建游标的基本步骤: 1. **声明游标**:`DECLARE 游标名 CURSOR FOR SELECT SQL语句;` 2. **打开游标**:`...

    mysql 存储过程应用(代码详解)

    本文通过一个具体的例子详细介绍了如何在MySQL中使用临时表、游标、异常处理和返回值来实现存储过程。这些技术可以极大地提高数据库应用程序的性能和可维护性。掌握这些技巧对于任何从事数据库开发工作的人员来说都...

    MYSQL数据库高级应用宝典含实例(索引、视图、触发器、游标和存储过程)

    游标是一种临时的工作单元,它可以在存储过程中使用,用于处理大量数据。游标的优点是: * 高效处理大量数据 * 实现数据的逐行处理 * 提高数据处理的效率 游标的创建: * DECLARE cursor_name CURSOR FOR SELECT ...

    mysql存储过程之游标(DECLARE)原理与用法详解

    MySQL存储过程中的游标(DECLARE)是处理查询结果集的重要工具,它允许程序逐行处理数据,而不是一次性加载所有结果。游标具有不同的模式,包括只读、不可滚动和敏感,每种模式都有其特定的应用场景。 只读模式的...

    mysql存储过程双层嵌套

    loop 游标双层嵌套循环 创建临时表, 游标

    在MySQL中同时查找两张表中的数据的示例

    在游标的循环中,使用`INSERT INTO`语句将数据插入到临时表中,然后移动游标到下一行。当`@@FETCH_STATUS`返回0时,表示游标成功获取了下一行,否则表示没有更多的行可取。`@@FETCH_STATUS`是一个系统变量,用于检查...

    mysql 树形结构查询

    * 在 MySQL 中,树形结构查询可以使用游标来遍历树形结构的数据。 * 存储过程可以提高查询效率和简化查询逻辑。 应用场景: * 树形结构查询可以应用于各种业务场景,例如公司组织结构、产品分类、评论系统等。 * ...

Global site tag (gtag.js) - Google Analytics