-- 修改会话变量的值 set session sort_buffer_size =50000; set @@session.sort_buffer_size =50000 ;
参数传递
in
传入的参数
-- 传入员工编号,查找员工信息 delimiter $$ createprocedure proc06(in empno01 int) begin select*from emp where empno = empno01; end $$ delimiter ;
call proc06(1001);
-- 封装有参数的存储过程,可以通过传入部门名和薪资,查询指定部门,并且薪资大于指定值的员工信息 delimiter $$ createprocedure dec_param0x(in dname varchar(50), in sal decimal(7,2)) begin select*from dept a, emp b where b.sal > sal and a.dname = dname; end $$ delimiter ;
call dec_param0x('学工部',20000);
out
从存储过程内部传值给调用者
delimiter $$ createprocedure proc08(in in_empno int, out out_ename varchar(50)) begin -- 查询emp表中empno与传进来的参数in_empno一致的ename并且赋值给out_ename返回 select ename into out_ename from emp where empno = in_empno; end $$ delimiter ;
call proc08(1001,@o_ename); select@o_ename;
-- 封装有参数的存储过程,传入员工编号,返回员工名字和薪资 delimiter $$ createprocedure proc09(in empno int , out out_ename varchar(50) , out out_sal decimal(7,2)) begin select ename,sal into out_ename,out_sal from emp where emp.empno = empno; end $$ delimiter ; call proc09(1001, @o_dname,@o_sal); select@o_dname; select@o_sal;
inout
从外部传入的参数经过修改后返回的变量
delimiter $$ createprocedure proc10(inout num int) begin set num = num *10; end $$ delimiter ;
-- 语法 if search_condition_1 then statement_list_1 [elseif search_condition_2 then statement_list_2] ... [else statement_list_n] end if
-- 输入学生的成绩,来判断成绩的级别: delimiter $$ createprocedure proc_12_if(in score int) begin if score <60 then select'不及格'; elseif score <80 then select'及格'; elseif score >=80and score <90 then select'良好'; elseif score >=90and socre <=100 then select'优秀'; end if; end $$ delimiter ;
call proc_12_if(88);
-- 输入员工的名字,判断工资的情况。 delimiter $$ createprocedure proc12_if(in in_ename varchar(50)) begin declareresultvarchar(20); declare var_sal decimal(7,2); select sal into var_sal from emp where ename = in_ename; if var_sal <10000 thensetresult='试用薪资'; elseif var_sal <30000 thensetresult='转正薪资'; else setresult='元老薪资'; end if; selectresult; end$$ delimiter ; call proc12_if('庞统');
case
-- 语法一(类比java的switch): case case_value when when_value then statement_list [when when_value then statement_list] ... [else statement_list] endcase
-- 语法二: case when search_condition then statement_list [when search_condition then statement_list] ... [else statement_list] endcase
delimiter $$ createprocedure pro14_case(in pay_type int) begin case pay_type when1thenselect'微信支付'; when2thenselect'支付宝支付'; when3thenselect'银行卡支付'; elseselect'其它支付'; endcase; end $$ delimiter ;
call pro14_case(2);
-- 语法二 delimiter $$ createprocedure proc_15_case(in score int) begin case when score <60 then select'不及格'; when score <80 then select'及格' ; when score >=80and score <90 then select'良好'; when score >=90and score <=100 then select'优秀'; else select'成绩错误'; endcase; end $$ delimiter ;
call proc_15_case(88);
循环语句
leave:类似于 break,跳出,结束当前所在的循环
iterate:类似于 continue,继续,结束本次循环,继续下一次
while
【标签:】while 循环条件 do 循环体; end while【标签】;
delimiter $$ createprocedure proc16_while(in insertCount int) begin declare i intdefault1; while i <= insertCount do insert intouser(uid,username,password) values(i,concat('user-',i),'123456'); set i = i +1; end while; end $$ delimiter ;
call proc16_while(10);
leave:跳出整个循环
-- 只插入前五条数据 delimiter $$ createprocedure proc17_leave(in insertCount int) begin declare i intdefault1; label:while i <= insertCount do insert intouser(uid,username,password) values(i,concat('user-',i),'123456'); if i =5then leave label; end if; set i = i +1; end while label; end $$ delimiter ;
call proc17_leave(10);
iterate:跳出本次循环
delimiter $$ createprocedure proc18_iterate(in insertCount int) begin declare i intdefault0; label:while i < insertCount do set i = i +1; if i =5then iterate label; end if; insert intouser(uid,username,password) values(i,concat('user-',i),'123456'); end while label; end $$ delimiter ;
call proc18_iterate(10);
repeat
-- 条件表达式为真时跳出循环 [标签:]repeat 循环体; until 条件表达式 end repeat [标签];
delimiter $$ createprocedure proc18_repeat(in insertCount int) begin declare i intdefault1; repeat insert intouser(uid,username,password) values(i,concat('user-',i),'123456'); set i = i +1; until i > insertCount end repeat; end $$ delimiter ;
call proc18_repeat(10);
loop
标签: loop 循环体; if 条件表达式 then leave 标签; end if; end loop;
delimiter $$ createprocedure proc19_loop(in insertCount int) begin declare i intdefault1; label: loop insert intouser(uid,username,`password`) values(i,concat('user-',i),'123456'); set i = i+1; if i > insertCount then leave label; end if; end loop label; end $$ delimiter ;
call proc19_loop(20);
游标
用来存储查询结果集的数据类型, 在存储过程和函数中可以使用光标对结果集进行循环的处理
-- 声明语法 declare 游标名 cursorfor 结果集;
-- 打开语法 open 游标名;
-- 取值语法,需要定义变量来保存结果集每一列 fetch 游标名 into 变量名 [, 变量名1] ...;
use mysql7_procedure; dropprocedure if exists proc21_cursor_handler; -- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资 ,将查询的结果集添加游标 delimiter $$ createprocedure proc20_cursor(in in_dname varchar(50)) begin -- 定义局部变量 declare var_empno int; declare var_ename varchar(50); declare var_sal decimal(7,2);
declare flag intdefault1; -- ---------------------
-- 声明游标 declare my_cursor cursorfor select empno,ename,sal from dept a, emp b where a.deptno = b.deptno and a.dname = in_dname;
-- 定义句柄,当数据未发现时将标记位设置为0 declare continue handler fornot found set flag =0; -- 打开游标 open my_cursor; -- 通过游标获取值 label:loop fetch my_cursor into var_empno, var_ename,var_sal; -- 判断标志位 if flag =1then select var_empno, var_ename,var_sal; else leave label; end if; end loop label;
-- 关闭游标 close my_cursor; end $$;
delimiter ; call proc21_cursor_handler('销售部');
综合:每天一张表,存当天的统计数据,就要求提前生产这些表——每月月底创建下一个月每天的表
-- 使用数据库mysql7_procedure use mysql7_procedure;
-- 如果存在同名的存储过程,则删除它 dropprocedure if exists proc22_demo;
-- 获取下个月的年份 set next_year =year(date_add(now(), INTERVAL1month));
-- 获取下个月是几月 set next_month =month(date_add(now(), INTERVAL1month));
-- 获取下个月最后一天是几号 set next_month_day = dayofmonth(LAST_DAY(date_add(now(), INTERVAL1month)));
-- 如果月份小于10,则在前面补零 if next_month <10then set next_month_str = concat('0', next_month); else set next_month_str = concat('', next_month); end if;
-- 循环直到下个月的最后一天 while t_index <= next_month_day do -- 如果天数小于10,则在前面补零 if t_index <10then set next_month_day_str = concat('0', t_index); else set next_month_day_str = concat('', t_index); end if;
-- 构建表名,格式为:user_YYYY_MM_DD set table_name_str = concat(next_year, '_', next_month_str, '_', next_month_day_str);