存储过程
-定义:带有逻辑的sql语句
-特点:1.执行效率快,存储过程是在数据库的服务器端执行的!!!
2.移植性差,不同数据库的存储过程是不能移植的。
-补充:
-全局变量:mysql的数据库内置变量
-查看所有全局变量:show variables
-查看某个全局变量:select @@变量名
-修改全局变量:set 变量名=新值
-会话变量:只存在于当前客户端与数据库服务器端的一次连接当中。如果链接断开,会话变量会失效。
-定义会话变量:set @变量 = '值'
-查看会话变量;select @变量名
-局部变量:在存储过程中使用的变量叫做局部变量,只要在存储过程执行完毕,局部变量就会失去。
-call pro_testOut(@name);
1.语法:
--创建存储过程
delimiter $ --声明结束符号
create procedure pro_test() --存储过程名称(参数列表)
begin
--可以写多个sql语句 +流程控制
select * from dept;
end $
--执行存储过程
call pro_test(); --call 存储过程名称(参数);
--删除存储过程
drop procedure pro_test;
2.参数:
1.)in:表示输入参数,可以携带数据带存储过程中
--创建输入参数的存储过程
delimiter $
create procedure pro_findById(in eid int) --in 输入参数
begin
select * from employee where id=eid;
end &
--调用
call pro_findById(22); --(数据库中存在的值)
2.)out:表示输出参数,可以从存储过程中返回结果
--创建输出参数的存储过程
delimiter $
create procedure pro_testOut(out str varchar(20)) --in 输入参数
begin
set str = '这是一个输出参数';
end &
--调用
call pro_testOut(@name); --定义会话变量声明
--查看输出的值
select @name;
3.)inout:表示输入输出参数,既可以输入,也可以输出。
--创建输出参数的存储过程
delimiter $
create procedure pro_testInOut(inout n int) --in 输入参数
begin
--查看变量
select n;
set n=500;
end &
--调用
set @n=10;
call pro_testInOut(@n); --定义会话变量声明
--查看输出的值
select @n;
4.)带有条件判断的存储过程
-输入1-7整数,返回星期几
--创建判断存储过程
delimiter $
create procedure pro_testIf(in num int,out str varchar(20))
begin
if num=1 then
set str='星期一';
elseif num=2 then
set str='星期二';
elseif num=3 then
set str='星期三';
elseif num=4 then
set str='星期四';
elseif num=5 then
set str='星期五';
elseif num=6 then
set str='星期六';
elseif num=7 then
set str='星期日';
else
set str='输入错误';
end if;
end $
--调用
call pro_testIf(1,@str);
--查看输出信息
select @str;
5.)循环格式的存储过程
输入一个整数,求和。列如:输入100,统计1-100的和。
--创建循环的存储过程
delimiter $
create procedure pro_testWhile(in num int,out result int)
begin
declare i int default 1; --定义局部变量
declare vnum int default 0;
while i<num do
set vnum=vnum+1;
set i=i+1;
end while;
set result=vnum;
end $
--调用
call pro_testWhile(100,@result);
--查看输出信息
select @result;