MySQL存储过程

存储过程是一组SQL语句集实现比较复杂的逻辑功能,存储过程跟触发器类似,存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事出发后自动调用。

存储过程弊端

  • 不同类型数据库语法有差别,移植困难。
  • 过多业务逻辑写入存储过程不利于维护,不利于分层管理。

1.创建存储过程

案例1:计算两数之和

DROP PROCUDURE IF EXISTS `adder`;
DELIMITER;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `adder`(IN a int, IN b int)
BEGIN
  DECLARE c int;

  IF a IS NULL THEN SET a=0;
  END IF;

  IF b IS NULL THEN SET b=0;
  END IF;

  SET c=a+b;
  SELECT c AS sum;
END
;;
DELIMITER;

调用存储过程

call add(1,2);

执行存储过程

set @a = 1;
set @b = 2;
call add(@a,@b);

语法

CREATE PROCEDURE procedure_name(
  [int|out|inout] parameter datatype
)
BEGIN
  statement;
END

案例2:查询记录数

CREATE PROCEDURE num_from_employee(IN emp_id INT, OUT count_num INT)
READS SQL DATA
BEGIN
  SELECT COUNT(*) AS count_num FROM employee WHERE id=emp_id;
END

2.IF条件控制

DROP PROCEDURE IF EXISTS `procIf`;
DELIMITER;;
CREATE DEFINE=`root`@`localhost` PROCEDURE `procIf`(IN type int)
ENGIN
  DECLARE c varchar(255);

  IF type=0 THEN SET c='parameter is 0';
  ELSEIF type=1 THEN SET c='parameter is 1';
  ELSE SET c='parameter is others, not 0 or 1';
  
  SELECT c;
END
;;
DELIMITER;

执行

SET @type=1;
CALL procIf(@type);

3.CASE条件控制

DROP PROCEDURE IF EXISTS `procCase`;
DELIMITER;;
CREATE DEFINE='root'@'localhost' PROCEDURE `procCase`(IN type int)
BEGIN
  DECLARE c varchar(255);

  CASE type
  WHEN 0 THEN SET c='parameter is 0';
  WHEN 1 THEN SET c='parameter is 1';
  ELSE SET c='parameter is others, not 0 or 1';
  END CASE;

  SELECT c;
END
;;
DELIMITER;

4.WHILE循环控制语句

DROP PROCEDURE IF EXISTS `procWhile`;
DELIMTER;;
BEGIN
  DECLARE i int;
  DECLAR j int;

  SET i=0;
  SET j=0;
  WHILE i<=n DO
    SET s = s+i;
    SET i = i+1;
  END WHILE;

  SELECT s;
END
;;
DELIMITER;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值