mySql存储过程-存储函数-触发器练习

举个栗子:某餐饮app提供了餐厅预约服务,用户选择菜品输入手机号即可进行预约;
表:商品表(prot_product)商户菜品
用户表(prot_user) 判断该用户是否已注册
预约表(prot_subscribe)保存预约信息,判断预约是否已满
日志表(prot_log)记录
工具:navicat
1.存储过程如下:create语句为navicat生成的

CREATE DEFINER=`root`@`localhost` PROCEDURE `pro_sub_add`(
    IN `in_mobile` varchar(20),
    IN `in_productid` bigint(20),
    OUT `ret_code` varchar(20))
label_pro:BEGIN
    DECLARE v_mobile  VARCHAR (20);
    DECLARE v_productid  BIGINT(20);
    DECLARE v_username  VARCHAR(20);
    DECLARE v_productname  VARCHAR(100);
    DECLARE v_num  INT DEFAULT 0;

    DECLARE v_sqlerr INT DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET v_sqlerr = 1;

    set ret_code = 'OK';

    //判断商品是否存在
    SELECT product_id,pro_name into v_productid,v_productname from prot_product WHERE product_id = in_productid;
    IF v_productid is null THEN
    set ret_code = 'NO_SUCH_PRODUCT';
        LEAVE label_pro;  //mysql存储过程没有return,可以使用leave结束存储过程,但要给存储过程一个标签label_pro,自定义到begin之前
    END IF;

    //判断用户是否已注册
    SELECT mobile,user_name into v_mobile,v_username from prot_user WHERE mobile = in_mobile;
    if v_mobile is null then
        set v_mobile = in_mobile;
    end if;

    //判断预约是否已满
    SELECT fun_querysub_num() into v_num FROM prot_subscribe; //调用了存储函数
    IF v_num >= 10 THEN
        set ret_code = 'SUB_FULL';
        LEAVE label_pro;
    END IF;

    //保存预约信息
    START TRANSACTION;
        INSERT INTO prot_subscribe (user_name,mobile,product_id,product_name) 
        VALUES (v_username,v_mobile,v_productid,v_productname);
    IF v_sqlerr = 1 THEN
        SET ret_code = 'INSERT_ERR';
        ROLLBACK;
    ELSE
        COMMIT;
    END IF;

END

2.触发器: ‘设计表’ 里添加触发器 ,再也不用担心create语句写错了
mySql存储过程-存储函数-触发器练习_第1张图片
触发器定义语句:

begin
   insert into prot_log(sub_id,mobile,product_id,time) 
   VALUES (NEW.sub_id,NEW.mobile,NEW.product_id,DATE_FORMAT(NOW(),'%Y%m%d%H%i%s'));
end

3.存储函数

CREATE DEFINER=`root`@`localhost` FUNCTION `fun_querysub_num`() RETURNS int(11)
BEGIN
    DECLARE v_num INT default 0;
    SELECT count(1) into v_num FROM prot_subscribe;

    RETURN v_num;
END

注:这只是个简单练习技术的例子

你可能感兴趣的:(数据库)