主要是进行练习题
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;