Mysql 系列 | procedure(存储过程)
存储过程是实现特定功能的语句集合,编译后存在数据库中。
通过存储过程的名字,并给定参数来调用。
创建
create procedure 过程名([IN|OUT|INOUT 参数名 数据类型])
begin
--- ;
end;
-
通常在创建之前先进行删除操作,
drop procedure if exists 过程名;
-
为了避免和 SQL 语句的结束符
;
冲突,创建前先申明存储过程要用的分隔符,delimiter 新分隔符
-
存储过程结束后还原分隔符,
delimiter ;
-
参数的格式是,
IN|OUT|INOUT 参数名 数据类型
IN
,输入参数,修改参数的值不能被返回OUT
,输出参数,可被更改并返回INOUT
,输入输出参数,可被更改并返回
-
结构体在
begin
和end
中间,可以定义变量写逻辑等
结构体
变量
-
定义
declare
-
declare i int default 0;
-
declare v varchar(255);
-
declare d date default '2022-08-17';
-
-
赋值,可以是一个固定的值,也可以从数据表中查出并赋值
-
set i = 9;
-
set v = 'hello'
-
select name into v from users where id = 1
,从 users 表中取得 name 赋值给 v
-
条件判断
-
if 条件1 then 语句1; elseif 条件2 语句2; else 语句3; end if;
-
case 判断条件 when 条件1 then 结果1; when 条件2 then 结果2; else 结果3; end case;
循环
-
while (条件) do 语句; end while;
-
repeat 语句; until 条件; end repeat;
-
loop_name: loop if 条件1 then leave loop_name; /* 相当于 break */ end if; if 条件2 then iterate loop_name; /* 相当于 continue */ end if; 语句; end loop loop_name;
调用
/* 如果有,先删除 */
drop procedure if exists p1;
/* 定义存储过程边界符 */
delimiter ;;
/* 创建存储过程 */
create procedure p1(in i1 int, in i2 int, out r int)
begin
结构体;
end;;
/* 还原边界符 */
delimiter ;
/* 调用 */
call p1(1, 2, @re);
select @re;
查看
-
/* 查看存储过程 */ SHOW PROCEDURE STATUS WHERE db=’数据库名’;
-
/* 查看存储过程定义内容 */ SHOW CREATE PROCEDURE 数据库.存储过程名;
修改
ALTER PROCEDURE 存储名
CONTAINS SQL /* 包含SQL语句,但不包含读或写数据的语句 */
NO SQL /* 不包含SQL语句 */
READS SQL /* 包含读数据的语句 */
MODIFIES SQL DATA /* 含写数据的语句 */
SQL SECURITY INVOKER /* 指明谁有权限执行,DEFINER(定义者可执行)、INVOKER(调用者可执行) */
COMMENT '注释内容' ; /* 添加注释 */