在上一篇文章:别再说不知道什么是存储过程和存储函数了 中简单的介绍了存储过程和存储函数以及其使用。其实存储过程是可以进行编程的,所以可以和其他的编程语言一样使用变量、表达式以及控制结构进行编程,从而实现一些复杂和有用的功能。这篇文章就来介绍一下存储过程的一些语法,并通过一些实例来讲解如何使用。
一、声明变量
在存储过程中可以通过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$
以上就是存储过程中的基本语法。将以上的语法进行结合可以写出复杂的和不同功能的存储过程,从而实现不同的需求开发。