最近因工作需要,看了一些关于mysql方面的内容,特别是有关存储过程、游标、临时表的介绍。通过之前写sql的一些经验,分享一些有关mysql存储过程区别及相关注意事项。
先看一下测试案例:
show databases;
use test;
drop procedure if exists proc_Test;
delimiter $$
create procedure proc_Test
(
_para nvarchar(50),
_para2 int
)
begin
-- 声明存储过程中的局部变量 这里注意一定要在存储过程的开头声明 否则会出现编译错误
declare done int default 0 ;
declare nameTemp nvarchar(50) default '';
declare createTimeTemp datetime ;
-- 定义该游标 用于数据检索 使用Loop循环
declare cur cursor for select nameStr,createTime from t_temptable;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
-- 定义该游标 用书数据输出 使用while 循环
-- 创建临时内存表
-- 该数据表的表结构存储在硬盘中,数据存储在内存中。可以将一些频繁使用的数据存储其中。
drop temporary table if exists temp_DemoTable;
create temporary table temp_DemoTable
(
nameStr nvarchar(50) not null
)engine=memory;
-- open cur;
-- 使用Loop的方式遍历数组
-- temploop:loop
-- fetch cur into nameTemp,createTimeTemp;
-- if (done=1) then
-- leave temploop;
-- end if;
-- insert into temp_DemoTable
-- select nameTemp;
-- end Loop temploop;
-- close cur;
open cur;
fetch cur into nameTemp,createTimeTemp;
while (done<>1) do
insert into temp_DemoTable
select nameTemp;
fetch cur into nameTemp,createTimeTemp;
end while;
close cur;
select * from temp_DemoTable;
drop temporary table if exists temp_DemoTable;
end;
$$
call proc_Test('',1);
下面就逐步分享一下这个案例注意的地方:
- delimiter 命令:在mysql中一条语句的结束是以";"。默认情况下delimiter就代表";"。而存储过程相当将多条语句封装成的一个代码段,所以就会出现开头的"delimiter $$"和结束的"$$"。这里就是手动将该代码段的结束符号修改为"$$"。
- delimiter $$
- 变量的声明:与MsSql相比除了语法存在一些微小的差别。还有一点需要注意的地方就是局部变量声明的位置。原则上为了提高程序的可读性,我们会将存储过程需要的变量在程序开头进行声明。在Mysql这里这个好的习惯变成强制性的要求。这里对应了demo中的第一处注释。变量的声明需要在开头。
- 临时表和临时内存表:这里对应的MSSql中的表变量和全局临时表(未经相关理论考证,纯属个人意见。如有不妥还请指出)。下面简单介绍一下临时表与临时内存表的区别及用途。
1)临时表:表结构存储在内存中,数据存储在内存中。适合当成大结果的子集进行数据存储及查询。
2)临时内存表:表机构存储在内存中,数据存储在内存中。可以将一些频繁使用的数据存储其中。与临时表不同之处,在于其不支持BLOB/Text列,同一时间需要足够的内存。
所以在这里需要提醒,建议在创建临时表或临时内存表在使用完后,显示的drop掉。在一定程度上介绍服务器内存的压力(未解决疑问:内存表表结构存储在硬盘中,数据在服务器重启后即丢失。是否可以在开发中规定必要的内存表用于存储高频率数据)。 - 游标的遍历方式:在mysql中支持wile、loop等循环。这里可详细参照Demo。这里补充一点,游标无法遍历临时表(至少现在我还没有实现),因为变量声明的数据的规定,游标变量需要在临时表声明之前创建。所以暂时还无法遍历临时表。如果哪位大侠早已实现还请赐教。
先总结到这里,还有不周之处还请指出。
转载于:https://blog.51cto.com/85608547/1406447