注意: 用户定义的变量无需对其进行声明或初始化,只不过获取到的值为null。
3、局部变量
局部变量是根据需要定义的在局部生效的变量,访问之前,需要declare声明,可用 作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的begin...end块。
声明: declare 变量名 变量类型 [default ...]; 其中变量类型就是数据库字段类型
赋值: set 变量名=值; set 变量名 := 值; select 字段名 into 变量名 from 表名 ...;
# 在存储过程中 声明一个stu_count局部变量,然后赋值及展示
create PROCEDURE pk2()
BEGIN
DECLARE stu_count int default 0;
SELECT count(*) into stu_count from king_user;
SELECT stu_count;
END;
CALL pk2();
if 条件判断的语法
if 条件1 then
。。。
elseif 条件2 then
。。。
else
。。。
end if;
# 判断 小明分数 例子
create PROCEDURE pk3()
BEGIN
DECLARE score int default 58;
DECLARE result VARCHAR(10);
if score >= 85 THEN
set result := '优秀';
elseif score >= 60 THEN
set result := '及格';
ELSE
set result := '不及格';
end if;
select result;
end;
# 结果为不及格;定义了score 默认值为58,此处代码不灵活
call pk3();
存储过程的参数:
in: 该参数作为输入,也就是需要调用时传入。
out: 该类参数作为输出,也就是该参数可以作为返回值。
inout: 既可以作为输入参数,也可以作为输出参数。
用法:
create procedure 存储过程名([in/out/inout 参数名 参数类型])
begin
SQL语句
end;
# 使用传参的方式
create PROCEDURE pk4(in score int,out result varchar(10))
BEGIN
#DECLARE score int default 58;
#DECLARE result VARCHAR(10);
if score >= 85 THEN
set result := '优秀';
elseif score >= 60 THEN
set result := '及格';
ELSE
set result := '不及格';
end if;
select result;
end;
# 传参测试
CALL pk4(80, @result);
select @result;
存储过程中的case|while 语句
case case_value
when when_value1 then 语句1
when when_value2 then 语句2
else 其它语句
end case;
语法2:
case
when search_condition1 then 语句1
when search_condition2 then 语句2
else 其它语句
end case;
案例: 使用存储过程实现,根据传入的月份,判定月份所属的季节(case结构实现)
1、1~3 月为第一季度
2、4~6月为第二季度
3、7~9月为第三季度
4、10~12月为第四季度
create PROCEDURE pk5(in month int)
BEGIN
DECLARE result VARCHAR(10);
CASE
WHEN month >=1 and month <=3 THEN
set result := '第一季度';
WHEN month >=4 and month <=6 THEN
set result := '第二季度';
WHEN month >=7 and month <=9 THEN
set result := '第三季度';
WHEN month >=10 and month <=12 THEN
set result := '第四季度';
ELSE
set result := '非法参数';
end case;
select CONCAT('输入的月份是: ',month,',所属的季度是: ',result);
end;
# 传参
call pk(11);
while循环是有条件的循环控制语句,满足条件后,再执行循环体中的SQL语句,语法如下:
while 条件
dosql 逻辑。。。
end while
create PROCEDURE pk6(in n int)
BEGIN
DECLARE total int default 0;
WHILE n>0 DO
set total := total n;
set n := n-1;
end WHILE;
SELECT total;
end;
call pk6(10)