您的位置:首页 > 数据库 > MySQL

《MySQL必知必会学习笔记》:存储过程

2016-04-08 15:53 567 查看

存储过程

什么是存储过程??

简单来说,存储过程就是为了以后使用而保存的一条或多条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;


使用存储过程的优点

和编程语言中使用的函数一样优点类似,模块化、重用等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: