存储过程的语法讲解

在上一篇文章:别再说不知道什么是存储过程和存储函数了
中简单的介绍了存储过程和存储函数以及其使用。其实存储过程是可以进行编程的,所以可以和其他的编程语言一样使用变量、表达式以及控制结构进行编程,从而实现一些复杂和有用的功能。这篇文章就来介绍一下存储过程的一些语法,并通过一些实例来讲解如何使用。

一、声明变量

在存储过程中可以通过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='[email protected]';
  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$

在这里插入图片描述
以上就是存储过程中的基本语法。将以上的语法进行结合可以写出复杂的和不同功能的存储过程,从而实现不同的需求开发。

本文原创首发于微信公众号:1024笔记,关注公众号可免费获取更多学习资源。

猜你喜欢

转载自blog.csdn.net/qq_41153943/article/details/105774546
今日推荐