存储过程

使用存储过程完成一些事务性操作,减少数据在数据库和服务器之间的传输,以达到提高数据处理效率的优化效果,以下是部分存储过程的代码

DROP PROCEDURE IF EXISTS execute_seckill;
DELIMITER $$ --console;转换为 $$

--定义存储过程
--参数:in输入参数, out输出参数
--row_count() : 返回上一条修改类型SQL(delete、insert、update)的影响行数
--row_count: 0:未修改 ; >0 :表示修改的行数  <0 : 表示sql错误或者说未执行

--  下面的seckill.execute_seckill,seckill表示数据库名,execute_seckill表示存储过程名
create procedure seckill.execute_seckill
(in v_seckill_id bigint, in v_phone bigint,
 in v_kill_time timestamp ,out r_result int)
  begin
    declare insert_count int default 0;
    start transaction ;
    insert ignore into success_killed
      (seckill_id, user_phone, create_time)
      values (v_seckill_id, v_phone, v_kill_time);
    select row_count() into insert_count;
    if (insert_count = 0) then
      rollback ;
      set r_result = -1;
    elseif (insert_count < 0) then
      rollback ;
      set r_result = -2;
    else
      update seckill
      set number = number - 1
      where seckill_id = v_seckill_id
        and end_time > v_kill_time
        and start_time < v_kill_time
        and number > 0;
        select row_count() into insert_count;
        if (insert_count = 0) then
          rollback ;
          set r_result = 0;
        elseif (insert_count < 0) then
          rollback ;
          set r_result = -2;
        else
          commit;
          set r_result = 1;
        end if;
    end if;
  end
$$
--存储过程定义结束

delimiter ;

set @r_result=-3;
select * from seckill where seckill_id=1003\G
-- 执行存储过程
call execute_seckill(1003,13888888888,now(),@r_result);
-- 获取结果
select * from seckill where seckill_id=1003\G
select @r_result;

 show procedure status where db='seckill'; --显示seckill数据库下的存储过程的信息
 show create procedure seckill.execute_seckill; -- 显示seckill数据库下execute_seckill存储过程的详细信息
 alter procedure execute_seckill; --修改存储过程
 drop procedure execute_seckill; --删除叫execute_seckill的存储过程
 DROP PROCEDURE IF EXISTS execute_seckill; --或这样写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值