• mysql游标中使用临时表


    有时候需我们要组合几张表的数据,在存储过程中,经过比较复杂的运算获取结果直接输出给调用方,比如符合条件的几张表的某些字段的组合计算,mysql临时表可以解决这个问题.

    所谓临时表:只有在当前连接情况下, TEMPORARY 表才是可见的。当连接关闭时, TEMPORARY 表被自动取消。必须拥有 create temporary table 权限,才能创建临时表。可以通过指定 engine = memory; 来指定创建内存临时表。

    drop table if exists  pre_person;
    create table `person` (
      `id` int(11)primary key NOT NULL DEFAULT '0',
      `age` int(11) DEFAULT NULL,
      `name` varchar(25) not null
    ) engine=innodb default charset=utf8;
    insert into person values(1,1,'张三'),(2,2,'李四'),(3,3,'王五'),(4,4,'赵六'),(5,5,'许仙');

    临时表支持主键、索引指定。在连接非临时表查询可以利用指定主键或索引来提升性能。比如这里我用存储过程语句及游标和临时表综合实例:

    drop procedure if exists sp_test; -- 判断存储过程函数是否存在如果是删除
    delimiter ;;
    create procedure  sp_test()  
    begin  
             create temporary table if not exists tmp   -- 如果表已存在,则使用关键词 if not exists 可以防止发生错误
             (  
               id int(11) ,  
               name varchar(10),  
               age int(3)
             ) engine = memory;  
             begin  
            declare ids int; -- 接受查询变量
            declare names varchar(10); -- 接受查询变量
            declare done int default false; -- 跳出标识
            declare ages int(3); -- 接受查询变量
            declare cur cursor for select id from person; -- 声明游标
            declare continue handler for not FOUND set done = true; -- 循环结束设置跳出标识
            open cur; -- 开始游标
            LOOP_LABLE:loop -- 循环
                FETCH cur INTO ids;
                select name into names from person where id=ids;
                select age into ages from person where id=ids;
                insert into tmp(id,name,age) value(ids,names,ages);
                if done THEN  -- 判断是否继续循环如果done等于true离开循环
                    LEAVE LOOP_LABLE; -- 离开循环
                END IF;
                end LOOP; -- 结束循环
            CLOSE cur; -- 关闭游标
         select * from tmp; -- 查询临时表
             end;  
             truncate TABLE tmp;   -- 使用 truncate TABLE 的方式来提升性能
    end;  
    ;;
    delimiter ;;

    然后执行存储过程:

    call sp_test();

    ??部分是字符编码问题...大家可以改下字符集(我这里就不再修改了。)

  • 相关阅读:
    Android项目实战(五十五):部分机型点击home再点图标进入程序不保留再之前界面的问题
    Android项目实战(五十四):zxing 生成二维码图片去除白色内边距的解决方案
    关于RecyclerView嵌套导致item复用异常,界面异常的问题
    191114
    191112
    191111
    191110
    191109
    191108
    191107
  • 原文地址:https://www.cnblogs.com/phpper/p/7440178.html
Copyright © 2020-2023  润新知