数据库储存过程分析
- SQL指令无需客户端编写,通过网络传送,可以节省网络开销,同时避免SQL指令在网络传输中被恶意篡改
- 存储过程经过编译创建并保存在数据库中,执行过程中无需重复操作
- 存储过程中多个SQL指令之间存在逻辑关系,支持流程控制语句
- 存储过程是根据不同的数据库进行编译执行创建并存储在数据库中,当我们需要切换到其他数据库产品时,需要重新编写针对于新数据库的存储过程的处理
- 在互联网项目中,如果需要数据库的高并发访问时,使用存储过程会增加数据库连接响应时间
创建储存过程的语法
create procedure <proce_name>([IN/OUT args])
begin
end;
示例:
-- 创建一个存储过程,实现加法运算
-- 在存储过程中,是有输入参数和输出参数的
create procedure proc_test01(IN a int, IN b int, OUT c int)
begin
SET c = a + b; -- 设置c的值为a+b
end;
调用
-- 调用存储过程
-- 定义变量m
SET @m = 0;
-- 调用存储过程,将12,23,@m分别传递给a,b,c
call proc_test01(12, 23, @m);
-- 显示变量值
-- dual为系统表,所定义的变量都存储在此表中
select @m from dual;
概念词
变量:局部变量、用户变量、会话变量、全局变量(会话变量和全局变量称为系统变量)
储存过程中如何定义变量?
- 使用set或select直接赋值,变量名以@开头 - set @var=1; 可以在一个会话的任何地方声明,作用域是整个会话,称为用户变量。
- 以declare关键字声明的变量,只能在存储过程中使用,称为存储过程变量
declare var1 int default 0; -- 定义一个局部变量默认值为1;(要用在存储过程中,或者是给存储传参数中)
以上2种变量的区别
在调用存储过程时,以declare声明的变量都会被初始化为null。而会话变量(即@开头的变量)则不会被再初始化,在一个会话内,只须初始化一次,之后在会话内都是对上一次计算的结果,就相当于在是这个会话内的全局变量。
1、局部变量,只在当前begin/end代码块中有效
2、用户变量,在客户端链接到数据库实例整个过程中用户变量都是有效的。
MySQL中用户变量不用事前申明,在用的时候直接用“@变量名”使用就可以了。
第一种用法:set @num=1; 或set @num:=1; //这里要使用set语句创建并初始化变量,直接使用@num变量
第二种用法:select @num:=1; 或 select @num:=字段名 from 表名 where ……,
select语句一般用来输出用户变量,比如select @变量名,用于输出数据源不是表格的数据。(注意两种赋值符号,使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值”)
会话变量和全局变量的区别:对全局变量的修改会影响到整个服务器,但是对会话变量的修改,只会影响到当前的会话(也就是当前的数据库连接)。
储存过程的控制流程
if-else-then
if a=1 then
-- sql
else
-- sql
end if;
-------------------------------
if a=1 then
-- sql
elseif a=2 then
-- sql
end if;
case
循环语句
while,repeat,loop
储存过程管理
1、查询储存过程 - (存储过程是属于某个数据库的,只能在当前数据库中调用该存储过程)
查询存储过程状态show procedure status where db = <数据库名>
查询存储过程的创建细节show create procedure mystudent.stu_fun3;
2、修改储存过程 - (修改存储过程指的是修改存储过程的特征)
3、删除储存过程
drop procedure <proce_name>;
-- 一般会只用以下语句删除
drop procedure if exists <proce_name>