-- mysql存储过程
delimiter $$
CREATE PROCEDURE proc01 ()
BEGIN
SELECT
emp_name,
emp_salary
FROM
emp;
END $$
delimiter;-- 调用存储过程
CALL proc01 ();-- 很类似调用函数(实际上就是将sql封装为函数)
-- 使用变量
delimiter $$
create procedure prooc02()
begin
declare var_name01 varchar(20) default 'aaa'; -- 声明变量(局部变量)
set var_name01 = '张三'; -- 给变量赋值
select var_name01; -- 输出变量的值
end $$
delimiter ;
call prooc02();
-- 可以使用 select .. into 为变量赋值
select emp_name into var_name from emp where dept_no = 0001; -- 将此写入存储过程代码中
-- 定义一个用户变量
-- @var_name
delimiter $$
create procedure proc04()
begin
set @var_name01 = '北京';
select @var_name01;
end $$
delimiter;
call proc04();
-- 看看用户变量是否可以在外部使用
select @var_name01;
-- 系统变量(mysql提前定义的,不能用户自己定义)
-- 系统变量-全局
-- @@global.var_name;
-- 查看所有的全局变量
show global variables;
select @@global.auto_increment_increment; -- 查看指定的全局变量
-- 修改全局变量
select @@global_sort_buffer_size = 30000;
-- 会话变量
show session variables;
set session sort_buffer_size = 50000; -- 修改
set @@session.sort_buffer_size = 60000;
-- 并不是所有的会话变量可以修改
-- 封装有参数的存储过程
-- 采用in进行传参
delimiter $$
create procedure proc06(in param_empno int)
begin
select * from emp where id = param_empno;
end $$
delimiter;
call proc06(2);
drop procedure proc06;
-- out传参(一般用在需要返回值的时候)
delimiter $$
create procedure proc08(in in_empno int ,out out_ename varchar(50))
begin
select ename into out_ename from emp where empno = in_empno;
end$$
delimiter;
call proc08(1001,@o_ename);
select @o_ename; -- 查询返回的名字
-- inout 从外部传入的传入的参数可以在函数内部进行修改,然后修改完之后还可以自动传出来
delimiter $$
create procedure proc10(inout num int)
begin
set num = num*10;
end $$
delimiter;
set @inout_num = 2;
call proc10(@inout_num);
select @inout_num;
-- 一个存储的判断过程
delimiter $$
create procedure proc_12_if(in score int)
begin
if score < 60
then
select "不及格";
elseif score >=60 and score < 90
then
select "及格";
elseif score >=80 and score <90
then
select '良好';
elseif score >=90 and score<=100
then
select "优秀";
else
select "成绩错误";
end if;
end $$
delimiter;
set @score = 65;
call proc_12_if(@score)
drop procedure if exists proc_13_if;
delimiter $$
create procedure proc_13_if(in ename varchar(20))
begin
declare var_sal decimal(7,2);
declare result varchar(20);
select emp_salary into var_sal from emp where emp_name = ename;
if var_sal <3000
then
set result = "试用薪资";
else
set result = "转正薪资";
end if;
select result;
end $$
delimiter;
call proc_13_if("王五");
-- case 的用法
delimiter $$
create procedure proc14_case(in pay_type int)
begin
case pay_type
when 1 then select '微信支付';
when 2 then select '支付宝支付';
when 3 then select "银行卡支付";
else select "其它";
end case;
end $$;
delimiter;
call proc14_case(2);
-- 循环
-- 创建一个测试表
create table jgdabc
(
uid int primary key,
username varchar(50),
password varchar(50)
);
-- 向表中添加指定条数据
delimiter $$
create procedure proc16_while(in insertCount int )
begin
declare i int default 1;
while i <=insertCount do
insert into jgdabc(uid,username,password)values(i,concat('user-',i),'123456');
set i = i+1;
end while;
end $$
delimiter;
-- 如果要用到leave跳出,那么必须使用lable
delimiter $$
create procedure proc16_while(in insertCount int )
begin
declare i int default 1;
lable : while i <=insertCount do
insert into jgdabc(uid,username,password)values(i,concat('user-',i),'123456');
set i = i+1;
if i =5 then
leave lable;
end if;
end while lable;
end $$
delimiter;
-- iterate 相当于continue
call proc16_while(10);
delimiter $$
create procedure proc16_while(in insertCount int )
begin
declare i int default 1;
lable : while i <=insertCount do
insert into jgdabc(uid,username,password)values(i,concat('user-',i),'123456');
set i = i+1;
if i =5 then
iterate lable; -- 死循环
end if;
end while lable;
end $$
delimiter;
delimiter $$
create procedure proc16_while(in insertCount int )
begin
declare i int default 1;
lable : while i <=insertCount do
set i = i+1;
if i =5 then
iterate lable; -- 死循环
end if;
insert into jgdabc(uid,username,password)values(i,concat('user-',i),'123456');
end while lable;
select "循环结束";
end $$
delimiter;
-- interate 跳出本层循环,继续下一次循环
-- repeat --- until
-- 相当于do -- while()
delimiter $$
create procedure proc16_while(in insertCount int )
begin
declare i int default 1;
label:repeat
insert into jgdabc(uid,username,password)values(i,concat('user-',i),'123456');
set i = i+1;
until i >insertcount
end repeat label;
select "循环结束";
end $$
delimiter;
-- loop
delimiter $$
create procedure proc19_loop(in insertCount int)
begin
declare i in default 1;
label : loop
insert into user(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(10);
-- cursor(游标)用来存储查询的结果集
-- 声明游标
declare cursor_name cursor for select_statemant -- 语法
-- 打开游标
open cursor_name
-- 取值语法
fetch cursor_name into var_name
-- 关闭游标
close cursor_name
-- 操作游标
-- 需求,输入一个部门名,查询员工的编号,名字,薪资,将查询的结果集添加到游标
delimiter $$
create procedure proc19_cursor(in in_dname varchar(50))
begin
-- 定义局部变量
declare var_empno int;
declare var_ename varchar(50);
declare var_sal decimal(7,2);
-- 声明游标
declare my_cyrsor cursor for
select empno,ename,salary
from dept a,emp b
where a.deptno = b.deptno and a.dname = in_dname;
-- 打开游标
open my_cursor;
label:loop
-- 通过游标获取值(fetch一次获取一行,所以写一个循环)
fetch my_cursor into var_empno,var_name,var_sal; -- 这样一直向下获取,当获取不到的时候会自己中断,然后报一个异常。
select var_empno,var_ename,var_sal;
end loop label;
-- 关闭游标
close my_cursor;
end $$;
delimiter ;
call proc19_cursor('销售部');
-- 句柄
-- handler 句柄
user mysql;
drop procedure if exists proc21_cursor_handler;
delimiter $$
create procedure proc21_cursor(in in_dname varchar(50))
begin
-- 定义局部变量
declare var_empno int;
declare var_ename varchar(50);
declare var_sal decimal(7,2);
-- 定义标记值
declare flag int default 1;
-- 声明游标
declare my_cursor cursor for
select empno,ename,sal
from dept a, emp b
where a,deptno = b.deptno and a.dname = in_name;
-- 定义句柄,定义异常的处理方法
-- 异常处理完之后,程序该怎么执行
-- contunue 继续执行剩余代码
-- exit 直接终止程序
-- undo : 不支持
-- 触发条件:条件码....,条件名....
-- 异常触发之后执行什么代码
-- 设置flag的值
declare continue handler for 1329 set flag =0;
-- 判断标志位
-- 如果flag地值为1就执行,反之,不执行
open my_cursor;
label:loop
fetch my_cursor into var_empno,var_ename,var_sal;
if flag =1 then
select var_empno,var_ename,var_sal;
else
leave label;
end if;
end loop label;
close my_cursor;
-- 句柄就是mysql的异常处理