mysql 存储过程
存储过程
什么是存储过程??
简单来说,存储过程就是为了以后使用而保存的一条或多条SQL语句的集合 .
和我们编程语言中的函数这个概念比较像。
在编程语言中,我们经常要完成某个功能,我们都会将它写成一个函数,然后在需要这个函数的时候调用它就好了。
同样的道理,存储过程也是这样,我们首先先声明这个存储过程,在我们需要这个存储过程的时候,我们调用这个存储过程就行了。
例如:在C语言中,我们想求两个数值a/b中的最大值。则我们可以写如下这样一个函数:
int myMax(int a,int b){
return a>b?a:b;
}
在main函数中相应的位置调用即可。
int main(void){
int a,b;
scanf("%d%d",&a,&b);
int maxValue=myMax(a,b);//调用
printf("max value %d",maxValue);
}
存储过程的定义和调用上面函数的定义是类似的。
存储过程的定义中,也可以有输入参数,也可以有返回值。下面我们介绍下存储过程的定义和调用。
还是以例子来进行说明:
在student表中的最后一列为学生成绩score,现在我们想为成绩写一个存储过程,以供以后一直使用。
在命令行应该这样来创建和调用如下:
delimiter // 改变MySQL语句的结束分隔符为//
create procedure p_scoreAvg()
begin
select avg(score) as avg_score from student;
end //
delimiter ; 恢复MySQL语句的结束分隔符为分号
注:
1、这里最要注意的是开始和结束位置的delimiter //和delimiter ;这两句,delimiter是分隔符的意思,由于MySQL默认的是以”;”z作为分隔符,而存储过程中会出现分号作为语句的一部分,如果我们之前不改变分隔符的号,MySQL还是会以分号作为语句分隔符结束。分隔符除了,其它的符号都可以作为分隔符,例如 $$
2、存储过程可以有输入参数,输出参数,也可以都没有,但是存储过程名后面的一对圆括号是不能少的。这一点和编程语言中的函数一致。
3、存储过程的过程体开始与结束使用begin和end进行标识。
上面就定义了一个无输入参数,也没有返回值的存储过程,调用此存储过程的方法如下:
call p_scoreAvg();
下面分别举一个既有输入也有输出的例子。
在举例子之前,我student2表中,插入了一些数据,这次是借助于SQLyog工具来做的,确实方便多了。
现在我们想根据学生的学号来得到学生的各科成绩以平均成绩。存储过程如下:
有了如上的存储过程之后,调用方法如下:
call p_student1(1,@avgScore);
select @avgScore;//显示出变量avgScore的值
在SQLyog中实践如下:
下面将讲解下存储过程的参数:
共有三种参数,形如:
create procedure ([IN|OUT|INOUT] 参数名 数据类型)
1、IN 输入参数
2、OUT 输出参数,可以被返回
3、INOUT 输入输出参数
MySQL存储过程的调用
用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体如下:
call procedure_name();//如果有参数,传入参数即可。
call procedure_name(@p1,@p2);//参数都是以@开头
变量
变量定义
DECLARE variable_name [,variable_name …] datatype [DEFAULT value];
其中datatype为MySQL的数据类型,如INT 、DECIMAL VARCHAR(length)等;
变量赋值
set varible_name=expression;
用户变量
1、在MySQL客户端使用用户变量
主要有select 和set为变量赋值:
例如:当有如下的存储过程:
当调用时,可以给输入参数作为一个变量,如下:
SET @id=1;//变量
CALL p_student1(@id,@avgScore);
SELECT @avgScore;
注意:用户变量名一般以@开头
存储过程中条件语句的应用
前面一直强调MySQL中的存储过程和其它编程语言中的函数类似,因此像IF-ELSE CASE WHILE 等都可以应用于存储过程中。
下面将分别举例来进行讲解。
IF ELSE的应用
CASE 的应用
上面就是关于case的用法,语法目前还不怎么熟悉,写起来怪怪的。
while的应用
调用后的结果如下:
上面只是简单的介绍了下IF-ELSE 、WHILE 、case的用法。存储过程还支持许多其他的语法。如:repeat等
删除存储过程
在MySQL中删除都是用DROP 来做。
因此,删除存储过程的命令如下:
drop procedure pro_name;
使用存储过程的优点
和编程语言中使用的函数一样优点类似,模块化、重用等。