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();
时间: 2024-10-30 02:20:50