mysql游标中使用临时表

Posted 周伯通的麦田

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();

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

以上是关于mysql游标中使用临时表的主要内容,如果未能解决你的问题,请参考以下文章

mysql存储过程中使用临时表和游标

MySQL 存储过程,获取使用游标查询的结果集

mysql 存储过程

sqlserver 表循环-游标表变量临时表

在 Sql Server 中,如何将游标中的值放入临时表中?

SQL Server 临时表与游标