mysql笔记 - 存储过程与自定义函数

479 查看

mysql笔记 - 存储过程与自定义函数

问题

mysql存储过程在线上用得其实并不多,生产环境也不会大量使用存储过程

  1. 性能比不用存储过程差一半,msyql存储过程性能不太好

  2. msyql存储过程出错了,调试起来并不太容易

  3. msyql大多数都是在互联网公司使用的,互联网公司业务比较简单不太需要用到存储过程,其次是在使用msyql的时候会使用到分布式msyql集群,目前大部分的分布式msyql中间件都是不支持存储过程的,所以msyql的存储过程和自定义函数用的是不多的

概述

  • 存储在数据库端的一组SQL语句集

  • 用户可以通过存储过程名和传参多次调用的程序模块

  • 存储过程的特点:

    • 使用灵活,可以使用流程控制语句、自定义变量等完成复杂的业务逻辑

    • 提高数据安全性,屏蔽应用程序直接对表的操作,易于进行审计

    • 减少网络传输

    • 提高代码维护的复杂度,实际使用中评估场景是否适合

流控制语句

IF 判断条件

 IF search_condition THEN statement_list
 [ELSEIF search_condition THEN statement_list] [ELSE statement_list] END IF

CASE 判断条件

 CASE case_value
 WHEN when_value THEN statement_list [ELSE statement_list] END CASE

WHILE 循环

 WHILE search_condition DO statement_list END WHILE

REPEAT 循环

 REPEAT statement_list
 UNTIL search_condition END REPEAT

和以前的if不一样,以前的叫if函数

基本语法

 CREATE
   [DEFINER = { user | CURRENT_USER }] 
   PROCEDURE sp_name ([proc_parameter[,...]]) 
   [characteristic ...] routine_body
 
 proc_parameter:
   [ IN | OUT | INOUT ] param_name type
 type:
   Any valid MySQL data type
 characteristic:
   COMMENT 'string'
   | [NOT] DETERMINISTIC
 routine_body:
   Valid SQL routine statement

示例与调用

阶乘

 CREATE PROCEDURE proc_test1  -- 创建一个存储过程叫proc_test1
 (IN total INT,OUT res INT) -- IN代表传入参数 total 类型INT,OUT表示传出参数res 类型INT
 BEGIN -- 表示代码块开始
  DECLARE i INT; -- 定义变量i INT类型
  SET i = 1; -- 用SET赋值
  SET res = 1; -- 用SET赋值
  IF total <= 0 THEN -- 如果total小于等于0
      SET total = 1; -- 设置total = 1
  END IF;
  WHILE i <= total DO -- 如果i小于等于total
      SET res = res * i;
      INSERT INTO tbl_proc_test(num) VALUES (res); 
      SET i = i + 1;
  END WHILE;
 END ; -- 表示代码块结束

调用

存储过程使用call调用

 delimiter //
 create procedure procTest() begin select * from a;end; //
 delimiter ;
 call procTest();

delimiter // 表示结束符,防止存储过程中打了;号就结束了,写完存储过程后再把结束符调整回来delimiter ;,当然在msyql workbench中可以方便的点击图形化界面创建存储过程语句

 call proc_test1(10, @res);
 select @res; -- @res表示存储过程中out的那个变量,这样可以将它打印出来
 

最后不建议用。。。