1.概念。
-事先经过编译并存储在数据库中的一段sql语句的集合。
2.区别。
-函数必须有返回值,存储过程没有。
-函数参数只有in,存储过程参数有in ,out ,inout。
3.优点。
-存储过程提高数据库执行效率,存储过程只在创建时候编译,sql语句每执行一次就编译一次。
-简化复杂操作,结合事务一起封装。
-复用性。
-安全性高,可指定存储过程的使用权。
4.创建与调用
-存储过程。
-将语句的;号改为//号,//就被传递到服务器而不是被sql自己编译。
-例子
//创建存储过程
delimiter //
create procedure pro(out result int)
begin
//执行语句
select count(id) into result from employer; //将查询结果放到result中。
end //
delimiter;
//调用存储过程。
call pro(@a);
select @a; //显示结果。
-函数。
-将;号改为$$号即可
-例子
//创建函数
delimiter$$
create function fun(s char(20)) returns char(20)
return contact('hello',s,'!');
$$
//调用函数
delimiter;
select fun('function1');
5 .查看
//查看定义
-show create procedure pro;
//查看状态
-show procedure status;
6.删除
一次只能删除一个存储过程或函数。
-drop procedure if exists pro ;
7.变量的使用
-变量的定义:局部变量作用域在begin和end之间,可以在嵌套块中使用,在复合语句和任何其他语句的前面定义。用户变量是在客户端中定义的,且只能被该客户使用,当客户端退出时候,该客户端连接的所有变量将自动释放。
-例子:
delimiter //
create procedure pro2();
begin
declare pro_name varchar(20);
set pro_name ='durant';
insert into department (name) values(pro_name);
end //
delimiter ;
//执行
call pro2();
8.流程控制
-可配合存储过程一起使用。
-例子(if 语句)
delimiter $$
create procedure pro3(int param int);
begin
declare var1 int;
set var1=param+1;
if var1>6 then
select * from employer where name like '%s';
else
select * from employer where name like 's%';
end if;
end $$
//使用用户变量
set @p=8;
$$
call pro3(@p);
$$
-例子(case 语句)
create procedure pro4(in param int)
begin
case param
when 1 then
update employer set salary =sarary*1.1;
when 2 then
update employer set salary =salary*1.2;
else
update employer set salary=salary*1.3;
end case;
end $$
delimiter;
set @m=3;
call pro4(@m);
-例子(loope语句)
delimiter $$
create procedure pro5(int param int);
begin
label 1: loop
set param=param+1;
if param<10 then
iterate label 1;//跳过此次循环。
end if;
leave label 1;//退出label 1;
end loop label 1;
end $$