【数据库】存储过程(procedure)

存储过程(procedure)

概念

存储过程是数据库中的一个对象
存储在服务端
用来封装多条SQL语句带有逻辑性
可以实现一个功能
由于它在创建时,就已经对SQL进行了编译
所以执行效率高,而且可以重复调用
类似于Java中的方法

语法:

DELIMITER $$
CREATE
    PROCEDURE `数据库名`.`存储过程名`(参数)
  
    BEGIN
        -- 存储过程 代码块
    END$$

DELIMITER ;

在这里本人对上述的语法进行下解释:
解释

  • 创建存储过程需要管理员 分配权限
  • delimiter是mysql定义的存储过程的结束标记
    (在mysql客户端结束标记默认是分号)
  • $$ 表示 mysql语句结束
    过程结束后肯定会有一句,表示恢复成默认的

参数

  • 格式:
参数使用种类 参数名称 参数类型
  • 参数使用种类
  1. in —— 输入参数
  2. out —— 输出参数
  3. 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 存储过程名称(参数)

参数

  1. 直接将数值作为参数
  2. 通过变量来设置参数:
    @变量名称

查询变量的值

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 ;

变量:

  1. 全局变量

全局变量(内置变量):可以在多个会话中去访问它

那么,对于全局变量,有很多语句和方法可以去查看或更改:
常用语句

  • show variables;
    查看所有全局变量
  • select @@变量名;
    查看某个全局变量
  • set 变量名=新值;
    修改全局变量
  1. 会话变量

只存在于 当前客户端 与 数据库服务器端一次连接当中
如果连接断开,那么会话变量全部丢失

常用语句

  • set @变量名=值
    定义会话变量
  • select @变量名
    查看会话变量
  1. 局部变量

在存储过程中使用的变量就叫局部变量。
只要存储过程执行完毕,局部变量就丢失!!

常用语句:

  • DECLARE 变量名 变量类型 DEFAULT 变量值;
    定义局部变量
  • set 变量名=变量值;
    给变量设置值

那么,本篇博文的知识点在这里就讲解完毕了。
(请观看本人博文 —— 《数据库 —— 专栏总集篇》)

你可能感兴趣的:(【数据库】存储过程(procedure))