存储过程的语法讲解

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

前言


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


这篇文章就来介绍一下存储过程的一些语法,并通过一些实例来讲解如何使用。


一、声明变量


在存储过程中可以通过Declare来定义一个局部变量,但是该变量的作用范围只是在Begin---End块中,比如:


create procedure p1()
begin
  declare a int default 5;
  select concat('a的值=',a);
end$
复制代码


结果如下:


796059fbf24d4d5bb7d252e1ef1e60a8~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


二、变量赋值


对于声明的变量可以通过使用set来进行赋值,比如:


create procedure p2()
begin
  declare name varchar(20);
  set name='Jifengjianhao';
  select name;
end$
复制代码


结果如下:



5841931e0b654d59a1b85e414a716433~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


另外除了通过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,这说明它是不能表示中文的,所以会报改错,这里讲对应的中文名称改为了英文,结果如下:


e5b718a0bc5646efa31933569c1de57b~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

300363557e484faf8403b9b75868ce2f~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


三、参数传递


在声明一个存储过程的时候可以进行传参,传递的参数类型可以有:


  • 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$
复制代码


结果如下:


6ab4513e5bdf4200ba13f26bb43273d0~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


四、条件判断


条件判断就类似于其他的编程语言里面的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$
复制代码


结果如下:


95d32cb6bb404b4e8f3b994104b28cb9~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


总结


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

目录
相关文章
|
存储 Oracle 关系型数据库
Oracle存储过程迁移ODPS-03(专有云):ODPS1.0支持exists语法
专有云目前还有不少ODPS1.0版本,主要是应对V3之前的平台版本。这个版本的ODPS不支持exists语法,如何换种写法实现。
2971 0
|
SQL 存储 关系型数据库
|
存储 SQL 关系型数据库
存储过程语法及实例
存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。 --------------------基本语法-------------------- 一.
825 0
|
存储 Oracle 关系型数据库
oracle的存储过程语法(转)
1、ORA-00942: table or view does not exist 指的你要操作的表尚未存在,需要先create出来先。 2、ORA-00922: missing or invalid option 指的是有语法错误。
1325 0
|
存储 SQL 数据库
SQLSERVER存储过程语法详解
SQL SERVER存储过程语法: Create PROC [ EDURE ] procedure_name [ ; number ]     [ { @parameter data_type }         [ VARYING ] [ = default ] [ OUTPUT ]     ] [ ,...n ]   [ WITH     { RECOMPILE | ENCRY
2048 0
|
SQL 存储 关系型数据库
DB2存储过程语法
原文 http://zhuyuehua110.blog.163.com/blog/static/918619420107953555989/ 语法:      CREATE PROCEDURE . (参数) [属性]       --参数:SQL PL 存储过程中有三种类型的参数:         IN:输入参数(默认值,也可以不指定)         OUT:输出参数         INOUT:输入和输出参数       --属性    1、LANGUAGE SQL    指定存储过程使用的语言。
1104 0
|
22天前
|
存储 SQL 关系型数据库
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
|
1月前
|
存储 关系型数据库 MySQL
Mysql基础第二十六天,使用存储过程
Mysql基础第二十六天,使用存储过程
28 0
Mysql基础第二十六天,使用存储过程
|
1月前
|
存储 SQL 关系型数据库
【MySQL 数据库】9、存储过程
【MySQL 数据库】9、存储过程
205 0