存储过程(procedure)
概念:
存储过程是数据库中的一个对象,
存储在服务端,
用来封装多条SQL语句且带有逻辑性,
可以实现一个功能
由于它在创建时,就已经对SQL进行了编译,
所以执行效率高,而且可以重复调用,
类似于Java中的方法
语法:
DELIMITER $$
CREATE
PROCEDURE `数据库名`.`存储过程名`(参数)
BEGIN
-- 存储过程 代码块
END$$
DELIMITER ;
在这里本人对上述的语法进行下解释:
解释:
- 创建存储过程需要管理员 分配权限
- delimiter是mysql定义的存储过程的结束标记
(在mysql客户端中结束标记默认是分号)- $$ 表示 mysql语句结束,
过程结束后肯定会有一句,表示恢复成默认的
参数:
- 格式:
参数使用种类 参数名称 参数类型
- 参数使用种类:
- in —— 输入参数
- out —— 输出参数
- inout —— 输入输出参数
- 注意:out与inout种类的参数,在最后设置值时,要用如下格式:
数值 into 参数名
例如:
DELIMITER $$
CREATE
PROCEDURE `performance_schema`.`myTestPro`(IN num INT,OUT r INT)
BEGIN
DELETE FROM emp WHERE empno=num;
SELECT COUNT(*) FROM emp INTO r;
END$$
DELIMITER ;
调用存储过程 call:
语法:
call 存储过程名称(参数)
参数:
- 直接将数值作为参数
- 通过变量来设置参数:
@变量名称
查询变量的值:
select @变量名
例如:
-- 调用存储过程
call myTestPro(9527,@rr);
--查询变量rr的值
select @rr
删除存储过程 drop:
语法:
drop procedure 存储过程名;
例如:
drop procedure myPro;
查看存储过程 show:
语法:
-- 查看 所有的存储过程状态
show procedure status\G;
-- 查看 创建存储过程的语句
show create procedure 存储过程名字\G;
带有IF逻辑的存储过程 if then:
语法:
IF 条件1 THEN
所执行的代码块1;
ELSEIF 条件2 THEN --注意elseif 是连在一起的
所执行的代码块2;
ELSE
所执行的代码块3;
END IF; -- 注意要结束 if 的后面有分号
例如:
DELIMITER $$
CREATE PROCEDURE pro_testIf(IN num INT,OUT str VARCHAR(20))
BEGIN
IF num=1 THEN
SET str='星期一';
ELSEIF num=2 THEN
SET str='星期二';
ELSEIF num=3 THEN
SET str='星期三'; -- 注意要用分号结束
ELSEIF num=4 THEN
SET str='星期四';
ELSEIF num=5 THEN
SET str='星期五';
ELSEIF num=6 THEN
SET str='星期六';
ELSEIF num=7 THEN
SET str='星期日';
ELSE
SET str='输入错误';
END IF;
END$$
DELIMITER ;
带有循环的存储过程 while do:
语法:
WHILE 条件 DO
代码块;
END WHILE; -- 要记得结束循环
例如:
DELIMITER $
CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT)
BEGIN
-- 定义一个局部变量
DECLARE i INT DEFAULT 1;
DECLARE vsum INT DEFAULT 0;
WHILE i<=num DO
SET vsum = vsum+i;
SET i=i+1;
END WHILE; -- 要记得结束循环
SET result=vsum;
END$$
DELIMITER ;
其他循环
REPEAT 循环:
语法:
REPEAT
要循环的代码块;
UNTIL 终止条件
END REPEAT;
例如:
DELIMITER $$
CREATE PROCEDURE proRepeat(OUT outnum INT)
BEGIN
DECLARE i INT DEFAULT 0;
REPEAT
SET i=i+1;
UNTIL i>=5 -- 注意这里不要加分号,不然语法报错 UNTIL 结束条件
END REPEAT; -- 记着结束
SET outnum=i;
END$$
DELIMITER ;
loop 循环:
语法:
循环的名称:LOOP
循环的代码块;
IF 条件1 THEN
LEAVE 循环的名称; -- 中断循环
END IF;
IF 条件2 THEN
ITERATE 循环的名称; -- 跳过本次循环,执行下一次循环
END IF;
END LOOP;
本人对上面的两个关键字做下解释:
解释:
- leave 相当于java中的 break
- iterate相当于java中的continue
例如:
DELIMITER $$
CREATE PROCEDURE proRepeat(OUT outnum INT)
BEGIN
DECLARE i INT DEFAULT 0;
myloop:LOOP -- 这里的myloop 是我给循环起的一个标号或者说名字,这是语法要求,不起就会报错
SET i=i+1;
IF i>=5 THEN
LEAVE myloop; -- 根据我的循环标号中断循环 leave 是中断循环的意思
END IF;
END LOOP;
SET outnum=i;
END$$
DELIMITER ;
变量:
- 全局变量:
全局变量(内置变量):可以在多个会话中去访问它
那么,对于全局变量,有很多语句和方法可以去查看或更改:
常用语句:
- show variables;
查看所有全局变量- select @@变量名;
查看某个全局变量- set 变量名=新值;
修改全局变量
- 会话变量:
只存在于 当前客户端 与 数据库服务器端 的 一次连接当中
如果连接断开,那么会话变量全部丢失!
常用语句:
- set @变量名=值
定义会话变量- select @变量名
查看会话变量
- 局部变量:
在存储过程中使用的变量就叫局部变量。
只要存储过程执行完毕,局部变量就丢失!!
常用语句:
- DECLARE 变量名 变量类型 DEFAULT 变量值;
定义局部变量- set 变量名=变量值;
给变量设置值
那么,本篇博文的知识点在这里就讲解完毕了。
(请观看本人博文 —— 《数据库 —— 专栏总集篇》)