前言
在上一篇文章:别再说不知道什么是存储过程和存储函数了中简单的介绍了存储过程和存储函数以及其使用。其实存储过程是可以进行编程的,所以可以和其他的编程语言一样使用变量、表达式以及控制结构进行编程,从而实现一些复杂和有用的功能。
这篇文章就来介绍一下存储过程的一些语法,并通过一些实例来讲解如何使用。
一、声明变量
在存储过程中可以通过Declare来定义一个局部变量,但是该变量的作用范围只是在Begin---End块中,比如:
create procedure p1() begin declare a int default 5; select concat('a的值=',a); end$ 复制代码
结果如下:
二、变量赋值
对于声明的变量可以通过使用set来进行赋值,比如:
create procedure p2() begin declare name varchar(20); set name='Jifengjianhao'; select name; end$ 复制代码
结果如下:
另外除了通过set来进行赋值以外,还可以通过select into 来进行赋值操作,select into就是讲一张表查询的结果赋值给声明的变量。在上篇文章创建了一张Employee表,具体创建可以阅读上篇文章,这里以该Employee来说明如何使用select into 进行赋值操作:
create procedure p4() begin declare name varchar(20); select lastname into name from employee where email='123@qq.com'; select name; end$ 复制代码
这里因为存储过程中的内容为latin1字符集,而latin1字符集为8bit,这说明它是不能表示中文的,所以会报改错,这里讲对应的中文名称改为了英文,结果如下:
三、参数传递
在声明一个存储过程的时候可以进行传参,传递的参数类型可以有:
- in:即传入参数,也是默认类型;
- out:该参数为输出参数,即是返回值;
- inout:既可以作为传入参数,也可以作为输出参数
比如,输入一个值,输出结果判断其是否大于10:
create procedure p6(in number int,out result varchar(100)) begin if number>10 then set result='number>10'; elseif number=10 then set result='number=10'; else set result='number<10'; end if; end$ 复制代码
结果如下:
四、条件判断
条件判断就类似于其他的编程语言里面的if else进行条件判断,根据不同的条件执行不同的分支,其语法结构为:
if condition then statement elseif condition then statement ...... else statement end if; 复制代码
主要这里的elseif 是一个单词,不是else if。其具体的实例可以参考上面的参数传递。
在上述的例子中,result变量前面加上了@。这时候就是result相当于用户会话变量,表示整个会话过程都是有作用的,类似于其他编程语言中的全局变量。另外还可以在变量前面加上@@符号,这时候就是什么变量为系统变量。
除了if elseif 可以进行条件判断,还可以通过case结构进行条件判断,语法结构为:
case when whenvalue then statement ..... else staement end case; 复制代码
比如,通过输入月份,判断属于第几季度:
create procedure p7(month int) begin declare result varchar(10); case when month>=1 and month<=3 then set result='第一季度'; when month>=4 and month<=6 then set result='第二季度'; when month>=7 and month<=9 then set result='第三季度'; else set result='第四季度'; end case; select result; end$ 复制代码
五、循环结构
1、while循环也是存储过程中的一种循环结构,其语法结构为:
while confition do statement end while; 复制代码
比如,计算从1加到10的结果:
create procedure p8(n int) begin declare result int default 0; declare start int default 0; while start <= 10 do set result = result+start; set start = start+1; end while; select n; end$ 复制代码
2、repeat 是另外一种循环控制语句,它与while不同的是:while是满足条件则执行,repeat则是满足条件则退出执行,其语法结构为;
repeat statement ....... until condition end repeat; 复制代码
还是上面的计算1加到10的例子,用repeat循环结构来写就是:
create procedure p9(n int) begin declare result int default 0; repeat set result = result+n; set n=n-1; until n=0; end repeat; select result; end$ 复制代码
3、loop也是一种简单的循环体,退出的条件需要使其他的语句定义,通常可以通过使用leave语句实现,其具体的语法如下:
loop statement,...... end loop 复制代码
还是上面的例子:
create procedure p10(n int) begin declare result int default 0; s:loop set result = result+n; set n=n-1; 退出条件 if n<=0 then leave s; end if; end loop s; select resule; end$ 复制代码
六、游标
游标是用来存储查询结果集的数据类型,在存储过程和存储函数中可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明,open、fetch、close:
声明: declare cursor_name cursor for select_statement; open: open cursor_name; fetch: fetch cursor_name into var_name,.... close: close cursor_name; 复制代码
实例:
create procedure p11() begin declare id int(10); declare name varchar(50); declare has_data int default 1; declare result cursor for select id,lastname from employee; declare exit handler for not found set has_data=0; open result; repeat fetch result into id,name; select id,name; until has_data = 0 end repeat; close result; end$ 复制代码
结果如下:
总结
以上就是存储过程中的基本语法。将以上的语法进行结合可以写出复杂的和不同功能的存储过程,从而实现不同的需求开发。