Mysql 系列 | procedure(存储过程)

存储过程是实现特定功能的语句集合,编译后存在数据库中。

通过存储过程的名字,并给定参数来调用。

创建

create procedure  过程名([IN|OUT|INOUT 参数名 数据类型])
begin
    --- ;
end;
  • 通常在创建之前先进行删除操作,drop procedure if exists 过程名;

  • 为了避免和 SQL 语句的结束符 ; 冲突,创建前先申明存储过程要用的分隔符,delimiter 新分隔符

  • 存储过程结束后还原分隔符,delimiter ;

  • 参数的格式是,IN|OUT|INOUT 参数名 数据类型

    • IN,输入参数,修改参数的值不能被返回
    • OUT,输出参数,可被更改并返回
    • INOUT,输入输出参数,可被更改并返回
  • 结构体在 beginend 中间,可以定义变量写逻辑等

结构体

变量

  • 定义 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 '注释内容' ;  /* 添加注释 */
posted @ 2022-08-17 18:28  菜乌  阅读(2792)  评论(0编辑  收藏  举报