Bootstrap

MySQL-存储过程

目录

一、存储过程定义

二、存储过程创建

1、变量的定义

2、存储过程的分支语句

2.1 双分支IF语句

2.2 多分支IF语句

3、存储过程的循环语句

三、存储过程调用

四、存储过程显示和删除


一、存储过程定义

存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。

存储过程的特点:

①完成特定功能的SQL语句集,是SQL语言层面的代码封装。

②经编译创建并保存在数据库中。

③用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

二、存储过程创建

语法:

create procedure 存储过程名(定义输入输出参数)

[存储特征]

begin

sql语句;

end

参数:

in表示输入参数

out表示输出参数

inout表示既可以输入也可以输出参数

例:在客户端显示”helloworld”字符串

CREATE PROCEDURE hello()

BEGIN

SELECT "helloworld";

END;

CALL hello(); #调用存储过程

1、变量的定义

declare 变量名 数据类型 default 默认值;

declare 变量名 表名.字段名%type default 默认值; #变量和某表的某字段保持一致

·变量就是在内存中分配的一块存储空间

2、存储过程的分支语句

2.1 双分支IF语句
IF 条件表达式 THEN

分支语句1;

ELSE

分支语句2;

END IF;

示例:定义一个存储过程,判断用户成绩是否及格

create procedure sc(in score int,out result varchar(10))

begin

if score>=60 then

set result="及格";

else

set result:="不及格";

end if;

end;
2.2 多分支IF语句
IF 条件表达式1 THEN

分支语句1;

ELSEIF 条件表达式2 THEN

分支语句2;

ELSE

分支语句3;

END IF;

示例:定义一个存储过程,判断成绩等级,用户输入百分制分数,[90,100]优秀,[80,90)良好,[70,80)一般,[60,70)及格,[0,60)不及格,其他分数-->参数值有误

DROP PROCEDURE IF EXISTS sclevel;

CREATE PROCEDURE sclevel(IN sc FLOAT,OUT res VARCHAR(10))

BEGIN

IF sc>100 THEN

SET res="输入参数有误!!!";

ELSEIF sc>=90 THEN

SET res="优秀";

ELSEIF sc>=80 THEN

SET res="良好";

ELSEIF sc>=70 THEN

SET res="一般";

ELSEIF sc>=60 THEN

SET res="及格";

ELSEIF sc>=0 THEN

SET res="不及格";

ELSE

SET res="输入参数有误!!!";

END IF;

END;

CALL sclevel(69.9,@r);SELECT @r;

3、存储过程的循环语句

 存储过程循环语法:

WHILE 循环条件

DO

循环语句体;

END WHILE;

注意:

通过定义一个控制变量控制循环次数(循环控制变量)

DECLARE i INT DEFAULT 0;

WHILE i<=99

DO

循环语句体;

SET i=i+1;

END WHILE;

三、存储过程调用

语法:

call 数据库名.存储过程名(参数1,参数2,...);

select 返回参数1,返回参数2...;

注意:

对于存储过程提供的临时变量而言,MySQL规定要加上@开头

例:两个数相加

delimiter@@ #重置命令结束标记

CREATE PROCEDURE addnum(IN num1 INT,IN num2 INT,OUT res INT)

BEGIN

DECLARE r INT;#声明变量

SET r:=num1+num2;

SET res:=r;

END@@

delimiter;
CALL addnum(1,2,@r);

SELECT @r;

例:定义一个存储过程,可以实现计算1+2+3+...+9999

CREATE PROCEDURE addsum(OUT res INT)

BEGIN

DECLARE i INT DEFAULT 1;

DECLARE sum_i INT DEFAULT 0;

WHILE i<=9999 DO

SET sum_i=sum_i+i;

SET i=i+1;

END WHILE;

SET res=sum_i;

END;
CALL addsum(@r);SELECT @r;

四、存储过程显示和删除

显示存储过程:

SHOW PROCEDURE STATUS;

删除存储过程:

DROP PROCEDURE [IF EXISTS] 存储过程名;

;