阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL 存储过程中使用游标中使用临时表可以替代数组效果

105次阅读
没有评论

共计 1509 个字符,预计需要花费 4 分钟才能阅读完成。

MySQL 不支持数组。但有时候需要组合几张表的数据,在存储过程中,经过比较复杂的运算获取结果直接输出给调用方,比如符合条件的几张表的某些字段的组合计算,MySQL 临时表可以解决这个问题. 临时表:只有在当前连接情况下,TEMPORARY 表才是可见的。当连接关闭时,TEMPORARY 表被自动取消。必须拥有 create temporary table 权限,才能创建临时表。可以通过指定 engine = memory; 来指定创建内存临时表。

先建立要用的数据表及数据:

drop table if exists  person;
create table `person` (
  `id` int(11)primary key NOT NULL DEFAULT ‘0’,
  `age` int(11) DEFAULT NULL,
  `name` varchar(225) not null
) engine=innodb default charset=utf8;
insert into person values(1,1,’zhangshan’),(2,2,’lisi’),(3,3,’lst’),(4,4,’jon’),(5,5,’test’);

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

drop procedure if exists sp_test_tt; — 判断存储过程函数是否存在如果是删除
delimiter ;;
create procedure  sp_test_tt() 
begin 
        create temporary table if not exists tmp  — 如果表已存在,则使用关键词 if not exists 可以防止发生错误
        (
          id varchar(255) , 
          name varchar(50), 
          age varchar(500)
        ) engine = memory; 
        begin 
        declare ids int; — 接受查询变量
        declare names varchar(225); — 接受查询变量
        declare done int default false; — 跳出标识
        declare ages int(11); — 接受查询变量
        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_tt();

 

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计1509字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中