• mysql 存储过程的学习


    主要是进行练习题

    create database 存储过程;
    use 存储过程;
    
    
    	delimiter //    -- 终止符的重新定义
    	create procedure test(in a int ,in b int)    -- 设定参数以及参数类型,参数和变量的区别为,参数可以在外部进行赋值而变量是在函数或者存储过程中定义死的,不能在外部进行更改
    	begin                                        -- 存储过程的主体部分封装在  begin ...  and
    
    			select a*b into @sqlcode;         	-- 将参数a,b乘机的结果赋值给用户变量@sqlcode
    		end //
    		
    	delimiter ;									-- 将终止符重新定义为;
    
    	call test(3,5);    							-- 在外部给参数a,b 进行赋值
    	select @sqlcode;
    
    	drop procedure test;
    
    --  -----------
    -- 增加输出参数 c
    --  ----------
    
    delimiter //
    create procedure tusm(in a int,in b int,out c int)
    begin 
    	select a+b into c;
        end //
    delimiter ;
    
    call tusm(2,3,@c);                          --  在外部调用输出参数
    select @c;
    
    
    delimiter //
    create procedure 四则运算(in a int,in b int ,in c char)
    begin
    	case												-- case when 的判断语句
    		when c= '+' then set @sqlcode=a+b;
            when c='*' then set @sqlcode=a*b;
            when c='-' then set @sqlcode=a-b;
            when c='/' then set @sqlcode=a/b;
            else set @sqlcode=0;
            end case;
    	end//
    delimiter ;
    
    call 四则运算(2,3,'*');
    select @sqlcode 运算结果;
            
    
    -- 无输出参数
    delimiter //
    create procedure 四则运算1(in a int ,in b int ,in c int)
    begin 
    	if c=1 then set @sqlcode=a+b;
        elseif c=2 then set @sqlcode=a-b;
        elseif c=3 then set @sqlcode=a*b;
        elseif c=4 then set @sqlcode =a/b;
        else set @sqlcode =0;
        end if;
    end //
    delimiter ;
    
    call 四则运算1(2,3,2);
    select @sqlcode;
    
    -- 有输出参数
    delimiter //
    create procedure 四则运算a(in a int ,in b int ,in c int ,out final float)
    begin
    	if c=1 then set final=a+b;
        elseif c=2 then set final=a-b;
        elseif c=3 then set final=a*b;
        elseif c=4 then set final =a/b;
        else set final =0;
        end if;
    end//
    delimiter ;
    
    call 四则运算a(2,3,2,@final);
    select @final;
    
    
    
    -- 计算1加到99的结果;
    delimiter //
    create procedure tt()							-- 此时已经设定好了,为1加到99  所以需要变量在内部进行设定,不再是参数
    begin
    	declare i int default 1;    				-- 变量的定义和初始化,赋值初始值为1
        set @final = 1;								-- 存放结果的用户变量  @final  是从1开始,所以下面循环时变量的递增在前面(i=i+1)
    	while i < 99 do								-- while 循环,让i的值和99进行比较   在设定循环的时候一定要有跳出循环的条件
    		set i = i+1;							-- 让变量进行递增
            set @final = @final + i;				
    	end while;									-- 结束循环
        
    end//	              							-- 结束整个存储过程的主体
    delimiter ;										-- 重新将终止符修改为;
    
    call tt();
    select @final;
    
    
    
    --   从1加到某一个数的第二种形式
    delimiter //
    create procedure 累加求和(in a int)
    begin
    	declare i int default 1;
        declare result int default 0;  --  此时为从0开始递增,所以变量的递增在后面,先进行累加
        
        while i <= a do
            set result = result + i;
    		set i = i+1;
    	end while;
        select result;
    end//
    delimiter ;
    call 累加求和(100);
    
    
    -- -----------
    -- 计算累加求和添加条件,,需要对偶数进行求和
    
    
    delimiter //
    create procedure 偶数和()
    begin
    	declare i int default 1;
        declare oushu int default 0;     -- 定义存储变量,初始值为0 
        
        while i<100 do
    		if mod(i,2)=0 then set oushu =oushu+i;     --  进行判断,是否为偶数  mod() 函数为求余数的函数
            end if;
            set i=i+1;        
    	end while;
        select oushu;
    end//
    
    delimiter ;        
    
    call 偶数和();
    
    
    
    
    
    -- ---------
    -- 需要先找出不变的部分和变化的部分,变化的部分又有什么规律,,利用规律进行循环设置,最后合并至不变的部分  用 concat函数   
    -- 合并时必须为字符串,数值和字符串转化的函数  cast  有限制只能转换为char()
    
    -- ---------
    
    --  添加字段
    
    delimiter //
    create procedure 添加字段()
    begin 
    	declare i int default 1;
        declare ci char(3) default '' ;
        set @final = 'alter table t1 ' ;     -- 需要注意的是,该有的必须都要有,例如空格、字符串等
        
        while i < 10 do      												--  结束循环的条件
    		set ci = cast(i as char(1));    								 --  将数值型转换为字符串型
            set @final = concat(@final,' add c',ci ,' char(1),' );  		 -- 字符串的连接
            set i = i+1;
    	end while;
        
        set @final = concat(@final,' add c10 char(1);');       				--  最后的语句和前面的add c1--9 char(1),  中的结束符不一致为封号  所以需要单独进行合并
        select @final;
        
    END//
    
    delimiter ;
    
    call 添加字段();
            
    prepare a from @final;												--  函数进行封装后,需要进行预处理才能调用
    execute a;															--   用execute  进行调用
    
    desc t1;
            
            
            
     --  删除字段       
     delimiter //
    create procedure 删除字段()
    begin 
    	declare i int default 1;
        declare ci char(3) default '' ;
        set @final = 'alter table t1' ;
        
        while i < 10 do
    		set ci = cast(i as char(1));
            set @final = concat(@final,' drop c',ci, ',' );
            set i = i+1;
    	end while;
        
        set @final = concat(@final,' drop c10;');
        select @final;
        
    END// 
    
    delimiter ;
    
    call 删除字段();
            
    prepare a from @final;
    execute a;
    
    desc t1;       
          
    --  ----------
    -- 判断循环嵌套   先循环后判断     
    -- 先循环后判断浪费资源,增加查询的时间,每一次都需要进行判断
    -- 先判断后循环,需要进行一次判断
    --  ------------
    
    --   先循环后判断
    delimiter //
    create procedure 添加或删除(in a int ,in b int)     -- 其中a为判断的条件,a=1时进行添加,a=2时未删除      , b  为循环条件,添加多少数据
    begin 
    	declare i int default 1;
        declare ci char(3) default '' ;
        declare bi char(3) default '' ;
        set @final = 'alter table t1' ;					-- 为固定不变的一部分,所以只需要在最后进行合并就行
     
     -- 先进行循环,在循环的内部嵌套判断
        while i < b do
    		set ci = cast(i as char(3));				-- 进行数值转换为字符型    在连接时只能连接字符
            if a=1 then set @final = concat(@final,' add c',ci ,' char(1),' );
    			elseif a=2 then  set @final = concat(@final,' drop c',ci, ',' );
    		end if;
    	set i = i+1;
    	end while;
        
    --  最后需要添加的c10部分,因为与前面的有区别,所以需要的循环外面单独进行添加
    		set bi = cast(b as char(3));
            if a=1 then set @final = concat(@final,' add c',bi,' char(1);');
    			elseif a=2 then set @final = concat(@final,' drop c',bi,';');
            end if;
        select @final;
        
    END//
    
    delimiter ;
    
    call 添加或删除(2,55);
    prepare a from @final;
    execute a;
    
    desc t1;        
            
    
            
    -- 循环判断嵌套  先判断后循环
    DELIMITER //
    CREATE PROCEDURE 初级封装(in ctype int, in cloop int)    --  ctype 判断条件删除或者添加  1 添加 2删除    cloop添加多少
    BEGIN
    	declare i int default 1;
        declare ni char(3) default '';
        set @final = 'alter table t1 ';
    
    --   先进行判断,在判断的内部嵌套循环
    
        if ctype = 1 then 
    		while i < cloop do
    			set ni = cast(i as char(3));
    			set @final = concat(@final,'add c',ni,' char(1),');
    			set i = i + 1;
    		end while;
    	elseif ctype = 2 then
    		while i < cloop do
    			set ni = cast(i as char(3));
    			set @final = concat(@final,'drop c',ni,',');
    			set i = i + 1;
    		end while;
    	else set @final = '参数错误';
        end if;
        
    --  最后的c10部分
    
    	if ctype =1 then
    		set @final = concat(@final, 'add c', cast(cloop as char(3)),' char(1);');
        elseif ctype = 2 then
    		set @final = concat(@final,'drop c',cast(cloop as char(3)),';');
    	else set @final = '参数错误';
        end if;
        
    	select @final;
        
    END //
    DELIMITER ;
            
    
    -- -------------------------
    -- 高级封装
    -- 变量
    -- 处理过程的用途
    -- 函数的创建日期和创建人  以及其它的相关内容
    -- ---------------------------
    
    -- ---------
    -- 先比于上面的部分,增加参数进行定义添加字段时的名称,不在是固定的名称
    
    DELIMITER //
    CREATE PROCEDURE 高级封装(in ctype int, in cloop int,in cname varchar(100))
    BEGIN
    	declare i int default 1;
        declare ni char(3) default '';
        set @final = 'alter table t1 ';
        
        if ctype = 1 then 
    		while i < cloop do
    			set ni = cast(i as char(3));
    			set @final = concat(@final,'add ',cname,ni,' char(1),');  --    第一次循环@final 内容  alter table t1 add cname1 char(1)
    			set i = i + 1;
    		end while;
    	elseif ctype = 2 then
    		while i < cloop do
    			set ni = cast(i as char(3));
    			set @final = concat(@final,'drop ',cname,ni,',');
    			set i = i + 1;
    		end while;
    	else set @final = '参数错误';
        end if;
        
    	if ctype =1 then
    		set @final = concat(@final, 'add ',cname, cast(cloop as char(3)),' char(1);');
        elseif ctype = 2 then
    		set @final = concat(@final,'drop ',cname,cast(cloop as char(3)),';');
    	else set @final = '参数错误';
        end if;
        
    	select @final;
        
    END //
    DELIMITER ;
    
    
    call 高级封装(2,22,'66期');
    prepare a from @final;
    execute a;
    desc t1;
    
    
    -- 指定追加字段的数据类型
    
    DELIMITER //
    CREATE PROCEDURE 超高级封装(in ctype int, in cloop int,in cname varchar(100),in type1 varchar(100))
    BEGIN
    	declare i int default 1;
        declare ni char(3) default '';
        set @final = 'alter table t1 ';
        
        if ctype = 1 then 
    		while i < cloop do
    			set ni = cast(i as char(3));
    			set @final = concat(@final,'add ',cname,ni,' ',type1,',');  --    第一次循环@final 内容  alter table t1 add cname1 char(1)
    			set i = i + 1;
    		end while;
    	elseif ctype = 2 then
    		while i < cloop do
    			set ni = cast(i as char(3));
    			set @final = concat(@final,'drop ',cname,ni,',');
    			set i = i + 1;
    		end while;
    	else set @final = '参数错误';
        end if;
        
    	if ctype =1 then
    		set @final = concat(@final, 'add ',cname, cast(cloop as char(3)),' ',type1,';');
        elseif ctype = 2 then
    		set @final = concat(@final,'drop ',cname,cast(cloop as char(3)),';');
    	else set @final = '参数错误';
        end if;
        
    	select @final;
        
    END //
    DELIMITER ;
    
    
    call 超高级封装(1,22,'66期','int');
    prepare a from @final;
    execute a;
    desc t1;
    

      

  • 相关阅读:
    用Processing生成屏保(二)
    NTFS文件系统
    用processing生成屏保程序
    用processing画李萨如曲线
    processing模拟三角级数合成方波过程
    express 设置 cookie 以及 httpOnly
    vue 使用 axios 时 post 请求方法传参无法发送至后台
    微信小程序访问后台出现 对应的服务器证书无效。控制台输入 showRequestInfo() 可以获取更详细信息。
    微信长按识别二维码,在 vue 项目中的实现
    vue-cli 构建的 Vue 项目用 localhost 加 端口 能访问,但是切换到 ip 加 端口 就不能访问
  • 原文地址:https://www.cnblogs.com/manjianlei/p/11363216.html
Copyright © 2020-2023  润新知