Mysql存储过程中使用临时表

临时表:只有在当前连接情况下, TEMPORARY 表才是可见的。当连接关闭时, TEMPORARY 表被自动取消。这意味着两个不同的连接可以使用相同的临时表名称,同时两个临时表不会互相冲突,也不与原有的同名的非临时表冲突。(原有的表被隐藏,直到临时表被取消时为止。)必须拥有 CREATE TEMPORARY TABLES 权限,才能创建临时表。可以通过指定 ENGINE|TYPE = MEMORY; 来指定创建内存临时表。

如果表已存在,则使用关键词 IF NOT EXISTS 可以防止发生错误。注意,原有表的结构与 CREATE TABLE 语句中表示的表的结构是否相同,这一点没有验证。注释:如果在 CREATE TABLE...SELECT 语句中使用 IF NOT EXISTS ,则不论表是否已存在,由 SELECT 部分选择的记录都会被插入。

DROP TEMPORARY TABLE 语句只取消 TEMPORARY 表,语句不会终止正在进行中的事务。在采用连接池的情况下,为防止多次 CREATE  DROP TEMPORARY TABLE 带来的性能瓶颈,可以使用CREATE IF NOT EXISTS + TRUNCATE TABLE 的方式来提升性能。

一般我是先删掉临时表再创建临时表。

   DROP TABLE IF EXISTS tmp_table;
	CREATE TEMPORARY TABLE tmp_table AS
	SELECT *  FROM table  

临时表支持主键、索引指定。在连接非临时表查询可以利用指定主键或索引来提升性能。

CREATE PROCEDURE sp_test_tt(IN i_chars VARCHAR(50),OUT o_counts BIGINT)
BEGIN
         create temporary table if not exists tmpTable – 不存在则创建临时表
         (
           objChk varchar(255) primary key,
           ModelName varchar(50),
           Operator varchar(500),
           PModelName varchar(50)
         );
         truncate TABLE tmpTable;  -- 使用前先清空临时表。
 
         insert into tmpTable values(i_chars,i_chars,i_chars,i_chars);
         insert into tmpTable values(i_chars,i_chars,i_chars,i_chars); -- 语句1
         select * from tmpTable; -- 语句2
         select count(*) into o_counts from tmpTable; -- 语句3
END;
上述代码语句   1   返回临时表中所有数据,语句   2   将总记录数写入输出参数。   truncate   语句放在   create 之后,而不是整个存储过程最后,原因在于随后的语句   1   插入同样的值,二临时表   PK   校验将产生一个错误,则存储过程最终异常结束。综合异常处理,可以如下修改,以在每次存储过程调用完毕后清除临时表。

CREATE PROCEDURE sp_test_tt(IN i_chars VARCHAR(50),OUT o_counts BIGINT)
BEGIN
         create temporary table if not exists tmpTable
         (
           objChk varchar(255) primary key,
           ModelName varchar(50),
           Operator varchar(500),
           PModelName varchar(50)
         ) ENGINE = MEMORY;
         begin
                   declare exit handler for sqlwarning,NOT FOUND,SQLEXCEPTION set o_counts=-1;
                   insert into tmpTable values(i_chars,i_chars,i_chars,i_chars);
                   select * from tmpTable; -- 语句1
                   select count(*) into o_counts from tmpTable;
         end;
         truncate TABLE tmpTable; -- 语句2
END;

 虽然上述代码语句 2 最后 truncate table 清空了全部临时表数据,但前面语句 1 select 的数据结果集不会被清除。已通过 java 程序验证。

临时表可以解决二维数组输出的问题。但是,大批量的数据插入只能由程序采用循环来做。某些特殊情况下的输入数组,例如选择好的一组待删除数据的 ID 的输入,也只能利用循环来做。临时表也不适用于需要三维数组的情况。




  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值