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;

  

猜你喜欢

转载自www.cnblogs.com/manjianlei/p/11363216.html