-- 创建函数delimiter $$ -- 自定义结束符createprocedure proc01()beginselect eid,ename from emp;end $$
delimiter;-- 将结束符还原成系统默认的符号call proc01();-- 调用函数delimiter $$
createprocedure proc02()begin-- 给变量赋值declare var_name01 varchar(20)default'aa';-- 声明变量,局部变量set var_name01 ='牛圣三';-- 变量赋值select var_name01;-- 输出变量,只能在end里面来调用end $$
delimiter;call proc02();delimiter $$
createprocedure proc03()begin-- 给变量赋值declare my_ename varchar(20);-- 声明变量-- set var_name01 = '牛圣三'; -- 变量赋值select ename into my_ename from emp where eid=1;select my_ename;-- 输出变量,只能在end里面来调用end $$
delimiter;call proc03();delimiter $$
createprocedure proc04()beginset@var_name01='北京';-- @ 定义全局变量,无需提前声明select@var_name01;end $$
delimiter;call proc04();select@var_name01;showglobal variables;-- 查看所有的全局变量select @@global.auto_increment_increment;-- 自增长变量setglobal sort_buffer_size=40000;select @@global.sort_buffer_size;-- 传入员工编号,查询员工信息delimiter $$
createprocedure proc05 (in num varchar(20))beginselect*from emp where eid=num;end $$
delimiter;call proc05(3);-- 传入部门名称和年龄,查询指定部门名,年龄>指定值的员工信息delimiter $$
createprocedure proc06(in nname varchar(20),in nage int)beginselect*from emp e,dept d where e.dept_id=d.deptno and d.name=nname and e.age>nage;end $$
delimiter;call proc06('研发部',20);-- 传入员工号,返回员工名delimiter $$
createprocedure proc07(in in_eid varchar(20),out out_ename varchar(20))beginselect ename into out_ename from emp where eid=in_eid;end $$
delimiter;call proc07(1,@o_ename);select@o_ename;-- 传入员工号,返回员工名和年龄delimiter $$
createprocedure proc08(in in_eid varchar(20),out out_ename varchar(20),out out_age int)beginselect ename,age into out_ename,out_age from emp where eid=in_eid;end $$
delimiter;call proc08(1,@out_ename,@out_age);select@out_ename;select@out_age;-- 传入一个人参数,传出这个数10倍的值delimiter $$
createprocedure proc09(inout num int)beginset num = num*10;end $$
delimiter;set@inout_num=2;call proc09(@inout_num);select@inout_num;-- 传入员工名,拼接部门号,传入薪资,算出年薪delimiter $$
createprocedure proc10(inout inout_ename varchar(20),inout inout_sal int)beginselect concat_ws('-', dept_id, ename)into inout_ename from emp where ename=inout_ename;set inout_sal=inout_sal*12;end $$
delimiter;set@inout_ename='虚竹';set@inout_sal=8000;call proc10(@inout_ename,@inout_sal);select@inout_ename;select@inout_sal;-- 存储过程流程控制-- if输入员工姓名判断工资情况,sal<10000 试用薪资,sal>=10000 and sal<20000 转正薪资,sal>=20000 元老薪资delimiter $$
createprocedure proc11(in in_ename varchar(20))begindeclare var_sal int;-- 创建一个变量declare result varchar(20);select sal into var_sal from emp where ename=in_ename;if var_sal<10000thenset result='试用薪资';elseif var_sal<20000thenset result='转正薪资';elseset result='元老薪资';endif;select result;-- 显示输出end $$
delimiter;call proc11('鸠摩智');call proc11('李秋水');-- case 支付方式: 1.'微信支付', 2.'支付宝支付', 3.'银行卡支付';-- 写法1delimiter $$
createprocedure proc12(in pay_type int)begincase pay_type
when1thenselect'微信支付';when2thenselect'支付宝支付';when3thenselect'银行卡支付';elseselect'其他支付方式';endcase;end $$
delimiter;call proc12(2);call proc12(10);-- 写法2delimiter $$
createprocedure proc13(in pay_type int)begincasewhen pay_type=1thenselect'微信支付';when pay_type=2thenselect'支付宝支付';when pay_type=3thenselect'银行卡支付';elseselect'其他支付方式';endcase;end $$
delimiter;call proc12(1);call proc12(3);-- while 创建表createtableuser(
uid intprimarykey,
username varchar(50),
password varchar(50));createtable user2(
uid int,
username varchar(50),
password varchar(50));-- 向表中添加指定条数据delimiter $$
createprocedure proc14(in insertcount int)begindeclare i intdefault1;-- 标签(可不写):while 条件 do
lable:while i<=insertcount doinsertintouser(uid,username,password)values(i,concat('user_',i),'123456');-- concat(); 拼接函数set i=i+1;endwhile lable;end $$
delimiter;call proc14(10);-- while-leavetruncatetableuser;-- 清空表delimiter $$
createprocedure proc15(in insertcount int)begindeclare i intdefault1;
lable:while i<insertcount doinsertintouser(uid,username,password)values(i,concat('user_',i),'123456');if i=5thenleave lable;-- 跳出循环endif;set i=i+1;endwhile lable;select'循环结束';end $$
delimiter;call proc15(10);-- while-iteratetruncatetable user2;delimiter $$
createprocedure proc16(in insertcount int)begindeclare i intdefault0;
lable:while i<insertcount doset i=i+1;if i=5theniterate lable;-- 跳出本次循环endif;insertinto user2(uid,username,password)values(i,concat('user_',i),'123456');endwhile lable;select'循环结束';end $$
delimiter;call proc16(10);-- repeattruncatetableuser;delimiter $$
createprocedure proc17(in insertcount int)begindeclare i intdefault1;
lable:repeatinsertintouser(uid,username,password)values(i,concat('user_',i),'123456');-- concat(); 拼接函数set i=i+1;
until i>insertcount
endrepeat lable;end $$
delimiter;call proc17(10);-- loop truncatetableuser;delimiter $$
createprocedure proc18(in insertcount int)begindeclare i intdefault1;
lable:loopinsertintouser(uid,username,password)values(i,concat('user_',i),'123456');-- concat(); 拼接函数set i=i+1;if i>insertcount
thenleave lable;endif;endloop lable;end $$
delimiter;call proc18(10);-- 游标-- 声明游标-- 打开游标-- 游标取值-- 关闭游标-- 输入一个部门名,查该员工的编号、名字、薪资,将查询的结果添加游标delimiter $$
createprocedure proc19(in in_name varchar(20))begindeclare var_eid varchar(20);declare var_ename varchar(20);declare var_sal int;declare my_cursor cursorforselect eid,ename,sal from dept a,emp b
where a.deptno=b.dept_id and a.name=in_name;-- 声明游标open my_cursor;-- 打开游标
lable:loopfetch my_cursor into var_eid,var_ename,var_sal;-- 通过游标获取值select var_eid,var_ename,var_sal;endloop lable;close my_cursor;-- 关闭游标end $$
delimiter;call proc19('研发部');dropprocedureifexists proc19;-- 删除存储过程-- 存储函数-- 创建无参数的dropfunctionifexists myfunc1;-- 删除存储函数delimiter $$
createfunction myfunc1()begindeclare cnt intdefault0;selectcount(*)into cnt from emp;return cnt;end $$
delimiter;
存储函数
delimiter $$
create function myfun1() returns int
begin
declare cnt int default 0;
select count(*) into cnt from emp;return cnt;
end $$
delimiter ;
select myfun1()-- 有参数
-- 传入参数,传入员工号,返回员工名
delimiter $$
create function myfun2(in_empno varchar(20)) returns varchar(20)
begin
declare out_ename varchar(20);
select ename into out_ename from emp where eid=in_empno;return out_ename;
end $$
delimiter ;
select myfun2(6);