当前位置:Gxlcms > mysql > mysql---存储过程_MySQL

mysql---存储过程_MySQL

时间:2021-07-01 10:21:17 帮助过:36人阅读

了解存储过程之前,先了解一下mysql的控制结构。

类似C语言(if……else、while循环等)SQL也有自己的控制结构。

if……else控制结构:

例如:

(1)

if 判断表达式    then 执行语句;end if;与c语言进行比较if(判断表达式)   执行语句;

(2)

if 判断表达式1    then 执行语句1;else   then  执行语句2;end if;与c语言进行比较if(判断表达式1)   执行语句1;else    执行语句2;

(3)

if 判断表达式1    then 执行语句1;elseif 判断表达式2    then  执行语句2;……elseif 判断表达式N    then 执行语句N;else   执行语句N+1;end if;与c语言进行比较if(判断表达式1)   执行语句1;else if(判断表达式2)   执行语句2;……else if(判断表达式N)   执行语句N;else   执行语句N+1;

需要注意所有的执行语句和end if都要以‘;’结束,而且判断表达式之后接then,还有一点与C语言不同的是elseif之间没有空格。

mysql中还有一些与if相关的函数

if(判断表达式,值1,值2) 如果表达式为“true”返回“值1”,表达式为“false”返回“值2”。类似于C语言中的三目运算符。

ifnull(表达式1,表达式2)如果表达式1不为空,则返回表达式1。如果表达式1为空,则返回表达式2

nullif(表达式1,表达式2)如果表达式1=表达式2,返回null ,否则返回表达式1。

case when控制结构:

有两种形式

(1)

case 待判断值 when 值1 then 
输出1when 值2 then 输出2……when 值N then 输出Nelse 默认输出 end; #如果输出时语句的话,最后的结尾要改成end case。输出的是值则是end同C语言的switch相比较switch(待判断值){case 值1:输出1 break;case 值2:输出2 break;……case 值N:输出N break;default:默认输出}

(2)

casewhen 判断表达式1 then 
输出1when 判断表达式2 then 输出2……when 判断表达式N then 输出Nelse 默认输出 end case; #如果输出时语句的话,最后的结尾要是end case。输出的是值则是end。

while循环结构:

while 判断表达式 do循环体end while;C语言中的while循环while(判断表达式){循环体;}

loop循环结构:无条件循环

标签:loop循环体;end loop;可以通过"leave 标签"来跳出loop循环。

repeat循环结构:

repeat循环体; until 判断表达式 end repeat;

现在开始介绍存储过程,其实存储过程跟函数很像

查看当前存储过程的状态:show procedure status;

创建存储过程:

create procedure 名称(参数列表)begin语句集end;

参数列表总是存在的,如果没有参数则应该是空参数列表(),参数必须指定数据类型而且每个参数默认都是一个in参数。要指定为其他参数,可以在参数前面加上out或inout关键字。默认的in类似于按值传递,在存储过程中对参数进行修改,调用者是看不到的。out参数只是用来从存储过程传回数据的,无论给参数传入什么值,这个参数的初始值始终是null。对于inout参数,调用者不仅可以设置参数的初始值,而且在过程中修改参数,调用者是看得到的类似与按地址传递

删除存储过程:drop procedure 名称;

查看存储过程:show create procedure 名称/G 类似于show create table 表名 /G的作用是横向显示

调用存储过程:call 名称(参数);

声明变量:

(1)declare变量名 变量类型 默认值; 声明变量必须在开头定义,如果没有默认值,初始值为null。作用范围是在begin……end内

(2)set @变量名=初始值;定义的变量是用户变量,在存储过程之外的sql也是可以调用的

变量赋值:set 变量名=变量值 切忌直接给变量赋值(变量名= 变量值)

还有一种给一个或多个变量赋值的方法:利用“select 指定列 into 指定变量”,所以select的结果必须是单行。

示例:

所有示例,都实现将分界符设置为'$'

delimiter $

1、测试if-else控制结构

/

2、测试case……when

第一种情况:

输出是值,结尾用end。一般用于select

/

输出是语句,结尾用end case。一般用于存储过程

/

第二种情况:

输出是语句,结尾用end case。一般用于存储过程

/

输出是值,结尾用end。一般用于select

/

3、测试while循环

/

4、测试loop

/

5、测试repeat

/

6、带参数的存储过程

默认为in的参数:按值传递

/

初始值为0的变量tmp作为参数传入存储过程后,虽然在存储过程内对其进行修改,但调用者再次查看tmp时,值仍然为0,没有变化

out参数:

/

由第一个select可以看出,out参数不允许将实参的值传入存储过程。通过第二个和第三个select可以看出,存储过程内部修改变量后可以返回给调用者。

与按地址传递还有所不同,out只允许返回值,不允许传入值。

inout参数:按地址传递,形参值改变会改变实参的值

/

第一个select结果为0,说明实参的值传进存储过程。第二个和第三个select结果表明,inout可以在存储过程内部修改形参的值,从而影响实参,类似于按地址传递

人气教程排行