mysql存储过程临时表赋值_Mysql存储过程(六)——存储过
程中使⽤临时表
Mysql 不⽀持数组。但有时候需要组合⼏张表的数据,在存储过程中,经过⽐较复杂的运算获取结果直接输出给调⽤⽅,⽐如符合条件的⼏张表的某些字段的组合计算。 Mysql 临时表可以解决这个问题。
临时表:只有在当前连接情况下, TEMPORARY 表才是可见的。当连接关闭时, TEMPORARY 表被⾃动取消。这意味着两个不同的连接可以使⽤相同的临时表名称,同时两个临时表不会互相冲突,也不与原有的同名的⾮临时表冲突。(原有的表被隐藏,直到临时表被取消时为⽌。)必须拥有 CREATE TEMPORARY TABLES 权限,才能创建临时表。可以通过指定 ENGINE|TYPE = MEMORY; 来指定创建内存临时表。
如果表已存在,则使⽤关键词 IF NOT EXISTS 可以防⽌发⽣错误。注意,原有表的结构与 CREATE TABLE 语句中表⽰的表的结构是否相同,这⼀点没有验证。注释:如果在 SELECT 语句中使⽤ IF NOT EXISTS,则不论表是否已存在,由 SELECT 部分选择的记录都会被插⼊。
DROP TEMPORARY TABLE 语句只取消 TEMPORARY 表,语句不会终⽌正在进⾏中的事务。在采⽤连接池的情况下,为防⽌多
次 CREATE 、 DROP TEMPORARY TABLE 带来的性能瓶颈,可以使⽤ CREATE IF NOT EXISTS + TRUNCATE TABLE 的⽅式来提升性能。
临时表⽀持主键、索引指定。在连接⾮临时表查询可以利⽤指定主键或索引来提升性能。
sql code 6-1:
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 校验将产⽣⼀个错误,则存储过程最终异常结束。综合异常处理,可以如下修改,以在每次存储过程调⽤完毕后清除临时表。
sql code 6-2:
CREATE PROCEDURE sp_test_tt(IN i_chars VARCHAR(50),OUT o_counts BIGINT)
mysql存储过程使用
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 的输⼊,也只能利⽤循环来做。临时表也不适⽤于需要三维数组的情况。