MySQL 5.0 版本开始支持存储过程。
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
下面的例子都是用emp表进行演示的,emp表的数据可以在这里自取 https://blog.csdn.net/wuyomhchang/article/details/124000402?spm=1001.2014.3001.5501
-- 变量的基本用法 SELECt MAX(sal) into @maxsal FROM emp; SELECt @maxsal; SELECT * FROM emp WHERe sal=@maxsal;一、存储过程的语法
-- 存储过程 DROp PROCEDURE IF EXISTS get_maxsal; --(自定义存储过程的名字) DELIMITER// CREATE PROCEDURE get_maxsal() BEGIN SELECT max(sal) FROM emp; --(begin-end写要执行的代码) END// CALL get_maxsal(); --调用存储过程二、在存储过程中声明并使用变量
-- 在存储过程中声明并使用变量 DROp PROCEDURE IF EXISTS get_sal(); DELIMITER// CREATE PROCEDURE get_sal() BEGIN DECLARE avgsal INT; SELECT AVG(sal) into avgsal FROM emp; SELECt ename,sal FROM emp WHERe sal > avgsal; END CALL get_sal();三、带参数的存储过程 语法
IN/OUT/INOUT param_name param_type(param_size) -- IN OUT INOUT为参数类型
IN 输入参数:表示该参数的值必须在调用存储过程时指定赋值,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数:该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数:调用时必须指定具体值,并且可在存储过程体重被改变和在调用完毕后可被返回
看个小栗子吧!
DROp PROCEDURE IF EXISTS get_sal();
DELIMITER//
CREATE PROCEDURE get_sal(IN empname VARCHAr(5),OUT empsal INT)
BEGIN
SELECT sal INTO empsal from emp WHERe ename=empname;
END//
-- 在存储过程中定义的参数,会在mysql中自动生成以下划线命名的参数
CALL get_sal('BLACK',@_empsal);
SELECt @_empsal;
四、流程控制函数 (类似于Java、python里的)
| 函数名称 | 作用 |
|---|---|
| IF | 判断,流程控制 |
| IFNULL | 判断是否为空 |
| CASE | 搜索语句 |
-- if判断
DROP PROCEDURE IF EXISTS get_sal;
DELIMITER//
CREATE PROCEDURE get_sal(IN empname VARCHAr(5),OUT sallevel VARCHAr(10))
BEGIN
DECLARE empsal INT;
SELECT sal INTO empsal FROM emp WHERe ename=empname;
IF empsal>3000 THEN
SET sallevel='high';
ELSEIF empsal<=3000 AND empsal>2000 THEN
SET sallevel='middle';
ELSE
SET sallevel='low';
END if;
END//
CALL get_sal('BLACK',@sallevel);
SELECt @sallevel;
2、case语法
作用
-
if 的高级版,类似Java 里面的 switch ... case
-
通过条件表达式匹配 case 对应的值,然后执行对应的操作
语法
-- 只有一个条件表达式
CASE
WHEN <条件1> THEN <操作>
WHEN <条件2> THEN <操作>
...
ELSE <操作>
END;
-
将 <表达式> 的值 逐一和 每个 when 跟的 <值> 进行比较
-
如果跟某个<值>想等,则执行它后面的 <操作> ,如果所有 when 的值都不匹配,则执行 else 的操作
-
如果 when 的值都不匹配,且没写 else,则会报错
看个栗子吧!
-- case语法 CREATE PROCEDURE p() BEGIN DECLARE v INT DEFAULT 1; case v WHEN 2 THEN SELECT v; WHEN 3 THEN SELECT 0; ELSE BEGIN SELECT 'hello'; END; END case; END CALL p();3、循环 REPEAT 语法
-- 基本语法 固定搭配 REPEAT statement_list UNTIL search_condition END REPEAT; -- UNTIL后为结束循环的条件
看个栗子吧!(打印指定开始和结束 数字的和)
-- 打印指定开始和结束 数字的和
DROP PROCEDURE if EXISTS dorepeat;
CREATE PROCEDURE dorepeat(in b INT,in e INT)
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE temp INT DEFAULT b;
REPEAT
set total=total+temp;
set temp=temp+1;
UNTIL temp>e END REPEAT;
SELECT total;
END
CALL dorepeat(1,10);
-- 例子2 应输出5 4 3 2 1 CREATE PROCEDURE dowhile() BEGIN DECLARE num int DEFAULT 5; WHILE num>0 DO SELECT num; SET num=num-1; END WHILE; END CALL dowhile();
再来一道题!! 编写一个存储过程,该存储过程接受一个部门编号作为参数,可以求出该部门的员工总数。
DELIMITER// CREATE PROCEDURE get_total (IN bianhao INT,OUT _total INT) BEGIN SELECT count(*) INTO _total FROM emp WHERe deptno=bianhao; END CALL get_total(10,@emptotal); SELECT @emptotal;
今天分享到此结束,因为最近学校事情多,所以更新会有点慢!感谢支持♥



