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

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

时间: 2024-10-13 16:21:54

mysql游标中使用临时表的相关文章

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

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

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

1.临时表 1 DROP PROCEDURE 2 IF EXISTS `P_GetMonitorPeople`; 3 CREATE PROCEDURE P_GetMonitorPeople (IN fgid INT, IN mins INT,in lens INT) 4 BEGIN 5 IF fgid>0&&mins>0&&lens>0 THEN 6 BEGIN 7 -- 建表tb_temp1 8 DROP TABLE IF EXISTS tb_temp1

mysql实例:在存储过程中创建临时表

在mysql的存储过程创建临时表的例子,是学习mysql 临时表操作的不错的例子. 操作步骤: mysql> mysql> mysql> CREATE TABLE Employee( //创建普通表 -> id int, -> first_name VARCHAR(15), -> last_name VARCHAR(15), -> start_date DATE, -> end_date DATE, -> salary FLOAT(8,2), ->

[转]MySQL游标的使用

转自:http://www.cnblogs.com/sk-net/archive/2011/09/07/2170224.html 以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助. 1. 无返回结果语句,如:INSERT,UPDATE,DROP, DELETE等 2. select语句返回单行变量并可传给本地变量(select ..into) 3. 返回

SqlServer和MySQL游标学习

一 sqlserver游标使用 /*** 游标的使用  讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱.  使用游标的顺序: 声名游标.打开游标.读取数据.关闭游标.删除游标. 1.3.1声明游标 最简单游标声明:DECLARE <游标名>CURSOR FOR<SELECT语句>: 其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询 例子: [已表2 AddSalary为例子] Declare mycursor cursor for select *

在oracle存储过程中创建临时表

在oracle的存储过程中,不能直接使用DDL语句,比如create.alter.drop.truncate等. 那如果我们想在存储过程中建立一张临时表就只能使用动态sql语句了: create or replace procedure pro as str_sql varchar2(100); begin -- 创建临时表 str_sql := 'create global temporary table temp_table ( col1 varchar2(10), col2 number

Mysql存储过程中使用cursor

一.表 学生表 CREATE TABLE `t_student` ( `stuNum` int(11) NOT NULL auto_increment, `stuName` varchar(20) default NULL, `birthday` date default NULL, PRIMARY KEY  (`stuNum`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 学生分数表 CREATE TABLE `t_stu_score` ( `id` int(11

MySQL游标的简单实践

Q:为什么要使用游标? A: 在存储过程(或函数)中,如果某条select语句返回的结果集中只有1行,可以使用select into语句(上几篇博客有介绍到用法)来得到该行进行处理:如果结果集中有多行,简单的select语句成批地进行处理,需要在检索出来的行中前进或后退一行或多行--若是想得到其中的每一行进行处理,就必须使用游标. Q:什么是游标? A: 游标(cursor),是一个存储在MySQL服务器上的数据库查询,游标不是一条 SELECT语句,而是被该语句检索出来的结果集:可以看做是指向

MySQL &#183; 特性分析 &#183; 内部临时表

http://mysql.taobao.org/monthly/2016/06/07/#rd MySQL中的两种临时表 外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表.这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭.这种临时表的命名与非临时表可以同名(同名后非临时表将对当前会话不可见,直到临时表被删除). 内部临时表 内部临时表是一种特殊轻量级的临时表,用来进行性能优化.这种临时表会被MySQL自动创建并用来存储某些操作的