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;

浙公网安备 33010602011771号