当前位置: 首页 > news >正文

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

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();

转载于:https://www.cnblogs.com/sztx/p/9499774.html

相关文章:

  • MAC Intellij IDEA 常用快捷键
  • day04Java语言基础+
  • 【安全牛学习笔记】vega
  • 关于Android Studio启动后自己的配置
  • 线性回归、岭回归和LASSO回归
  • 微信图片防盗链解决办法
  • LAMP架构讲解(续一)
  • Jquery中attr 和 prop的区别和联系
  • Glide配合CircleImageView加载圆形图片的巨坑
  • Attempting to write a row[5] in the range [0,394] that is already written to disk.
  • 全国首个云计算硕士高端班北航开班
  • 也说说Docker、Moby和Rancher
  • React 的性能优化(一)当 PureComponent 遇上 ImmutableJS
  • 软件需求分析
  • 关于Java的File类、字节流和字符流
  • 收藏网友的 源程序下载网
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • es的写入过程
  • express + mock 让前后台并行开发
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Redis中的lru算法实现
  • select2 取值 遍历 设置默认值
  • vue2.0项目引入element-ui
  • 动态魔术使用DBMS_SQL
  • 规范化安全开发 KOA 手脚架
  • 漂亮刷新控件-iOS
  •  一套莫尔斯电报听写、翻译系统
  • 责任链模式的两种实现
  • elasticsearch-head插件安装
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #### go map 底层结构 ####
  • ###项目技术发展史
  • #AngularJS#$sce.trustAsResourceUrl
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #pragma multi_compile #pragma shader_feature
  • (2)nginx 安装、启停
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (9)STL算法之逆转旋转
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三)uboot源码分析
  • (十) 初识 Docker file
  • (四)模仿学习-完成后台管理页面查询
  • (一)appium-desktop定位元素原理
  • (原)Matlab的svmtrain和svmclassify
  • (转)大型网站的系统架构
  • (转)我也是一只IT小小鸟
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core 中的路径问题
  • .Net Web项目创建比较不错的参考文章