欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

mysql---存储过程_MySQL

程序员文章站 2022-05-12 17:40:21
...
了解存储过程之前,先了解一下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控制结构

mysql---存储过程_MySQL

2、测试case……when

第一种情况:

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

mysql---存储过程_MySQL

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

mysql---存储过程_MySQL

第二种情况:

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

mysql---存储过程_MySQL

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

mysql---存储过程_MySQL

3、测试while循环

mysql---存储过程_MySQL

4、测试loop

mysql---存储过程_MySQL

5、测试repeat

mysql---存储过程_MySQL

6、带参数的存储过程

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

mysql---存储过程_MySQL

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

out参数:

mysql---存储过程_MySQL

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

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

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

mysql---存储过程_MySQL

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