存储过程学习笔记
什么叫存储过程
存储过程,带有逻辑的sql语句
存储过程特点
1)执行效率非常快!存储过程是在数据库的服务器端执行的!!!
2)移植性很差!不同数据库的存储过程是不能移植。
创建存储过程
delimiter $ --声明存储过程的结束符
CREATE PROCEDURE pro_test() --存储过程名称(参数列表)
BEGIN -- 开始
-- 可以写多个sql语句 --sql语句+流程控制
select *FROM employee;
END $ --结束 结束符
--执行存储过程
call pro_test();
参数:
in: 表示输入参数,可以携带数据到存储过程中
out: 便是输出参数,可以从存储过程中返回结果
inout:即可以有输出也可以有输入
-- 带有存储谁参数的存储过程
-- 需求:传入一个员工的id,查询员工信息
--创建
delimter $
create proocedure pro_findByid(in eid int) --in:输入参数
begin
select * from employee where id=eid;
end$
--调用
call pro_findById(4);
--需求带有输出参数的存储过程
创建
delimter $
create proocedure pro_findByid(out str varchar(20)) --out:输出参数
begin
set str="sssss";
end$
--mysql的变量:全局变量(内置变量),查看全局变量 :show variables(所有连接斗气作用)
--查看某个全局变量:select @@变量名
-- character_set_cliect: 服务器接受客户端的编码格式 set character_set_cliect=gbk:在命令性执行可以改变编码格式
--character_set_result;反之
--会话变量:只存在于当前客户端与数据库服务端的一次连接中。如果连接中断会话变量会全部丢失
--定义会话变量:set@变量=值
--查看会话变量:select @变量
--局部变量:在存储过程工资高使用的变量。只要存储过程执行完毕局部变量就会消失不用@
-- 定义一个会话变量 使用name会话变量接收存储过程的返回值
call pro_ pro_findByid( @name);
查看变量
select @name;
删除存储过程: drop procedure pro_findByid ;
--有输入输出的存储过程
delimter $
create proocedure pro_testInOut(inout n int) --out:输出参数
begin
--查看变量
select n;
set n=500;
end$
--调用
set @n=10;
call pro_testInOut (@n);
select @n;
--带有条件判断的存储过程逻辑
--需求 输入一个整数,如果1 返回星期一,如果2 ,返回星期二如果 ,3返回星期三 其他,
delimter $
create proocedure pro_testif(in num int,out str varchar(20)) --out:输出参数
begin
if num=1 then
set str="星期一";
else if num=2 then
set str="星期二";
else if num=3 then
set str="星期三";
end if;
end$
call pro_testif(4,@test);
select @test;
3.5 带有循环功能的存储过程
--需求:输入一个整数
delimter $
create proocedure pro_testwhile(in num int,out result int) --out:输出参数
begin
--定义一个索引变量,局部变量
declare i int default 1;
declare vsum int defalt 0;
while i<num do
set vsum=vsum+i;
set i=i+1;
end while
set result=vsum;
end$
call pro_testwhile(100,@result);
select @reuslt;
--语法·:使用查询的结果复制给变量(into)
delimter $
create proocedure (in eid int,out vname varchar(20)) --out:输出参数
begin
select empNmae into vnamefrom employee where id=eid;
end$
call pro_testId2(1,@name);
select @name;