mysql 存储过程

Posted 梁大师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

使用存储过程的优点

和编程语言中使用的函数一样优点类似,模块化、重用等。





以上是关于mysql 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHP 代码中调用 MySQL 存储过程?

如何从 PHP 代码中调用 MySQL 存储过程?

如何从 PHP 代码中调用 MySQL 存储过程?

java 登录过程 - android片段,异步任务登录,Asp.net控制器,存储库

[转]MYSQL 创建存储过程

怎么在mysql中查询已建立的存储过程