最近因工作需要,看了一些关于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);



   下面就逐步分享一下这个案例注意的地方:

  1. delimiter 命令:在mysql中一条语句的结束是以";"。默认情况下delimiter就代表";"。而存储过程相当将多条语句封装成的一个代码段,所以就会出现开头的"delimiter $$"和结束的"$$"。这里就是手动将该代码段的结束符号修改为"$$"。
  2. delimiter $$
  3. 变量的声明:与MsSql相比除了语法存在一些微小的差别。还有一点需要注意的地方就是局部变量声明的位置。原则上为了提高程序的可读性,我们会将存储过程需要的变量在程序开头进行声明。在Mysql这里这个好的习惯变成强制性的要求。这里对应了demo中的第一处注释。变量的声明需要在开头。
  4. 临时表和临时内存表:这里对应的MSSql中的表变量和全局临时表(未经相关理论考证,纯属个人意见。如有不妥还请指出)。下面简单介绍一下临时表与临时内存表的区别及用途。
       1)临时表:表结构存储在内存中,数据存储在内存中。适合当成大结果的子集进行数据存储及查询。

       2)临时内存表:表机构存储在内存中,数据存储在内存中。可以将一些频繁使用的数据存储其中。与临时表不同之处,在于其不支持BLOB/Text列,同一时间需要足够的内存。

       所以在这里需要提醒,建议在创建临时表或临时内存表在使用完后,显示的drop掉。在一定程度上介绍服务器内存的压力(未解决疑问:内存表表结构存储在硬盘中,数据在服务器重启后即丢失。是否可以在开发中规定必要的内存表用于存储高频率数据)。
  5. 游标的遍历方式:在mysql中支持wile、loop等循环。这里可详细参照Demo。这里补充一点,游标无法遍历临时表(至少现在我还没有实现),因为变量声明的数据的规定,游标变量需要在临时表声明之前创建。所以暂时还无法遍历临时表。如果哪位大侠早已实现还请赐教。



   先总结到这里,还有不周之处还请指出。

       



转载于:https://blog.51cto.com/85608547/1406447