例子

-- 秒杀执行存储过程
DELIMITER $$ -- 将分隔符; 转换为 $$
-- 定义存储过程
-- 参数: in 输入参数; out 输出参数
-- row_count():返回上一条修改类型sql(delete,insert,update)的影响行数
-- row_count: 0:未修改数据; >0:表示修改的行数; <0:sql错误/未执行修改sql
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);--执行insert语句
    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;--执行update语句
      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;--结束IF语句
    END IF;--结束IF语句
  END;--结束储存过程
$$--结束sql
-- 存储过程定义结束

DELIMITER ;--还原分隔符为;
--
set @r_result=-3;--定义用户变量
-- 执行存储过程
call execute_seckill(1003,13502178891,now(),@r_result);
-- 获取结果
select @r_result;

-- 存储过程
-- 1:存储过程优化:事务行级锁持有的时间
-- 2:不要过度依赖存储过程
-- 3:简单的逻辑可以应用存储过程
-- 4:QPS:一个秒杀单6000/qps

1.储存过程参数

  • IN:参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
  • OUT:该值可在存储过程内部被改变,并可返回
  • INOUT:调用时指定,并且可被改变和返回

  • [IN|OUT|INOUT] 参数名 数据类型
  • 比如: IN number INT
  • 例子:
DELIMITER //
  CREATE PROCEDURE myproc(OUT s int)
    BEGIN
      SELECT COUNT(*) INTO s FROM students;
    END
    //
DELIMITER ;

2.Mybatis调用储存过程

    <!-- statementType 声明指向的是什么类型,其中CALLABLE是执行存储过程和函数的-->
    <select id="killByProcedure" parameterType="map" statementType="CALLABLE">
        call execute_seckill(
            #{seckillId,jdbcType=BIGINT,mode=IN},
            #{phone,jdbcType=BIGINT,mode=IN},
            #{killTime,jdbcType=TIMESTAMP,mode=IN},
            #{result,jdbcType=INTEGER,mode=OUT}
        )
    </select>

从一个例子入门Mysql储存过程的更多相关文章

  1. mysql储存过程入门学习

    转载至:https://www.yiibai.com/mysql/getting-started-with-mysql-stored-procedures.html 1.mysql储存过程的创建 DE ...

  2. MySQL 储存过程-原理、语法、函数详细说明

    Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命 ...

  3. Mysql 储存过程以及 python callproc调用

    一.存储过程(stored procedure) 存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就 ...

  4. MySQL储存过程

    储存过程 本文章原创,转载需注明出处. 前提: 在大型数据库中 来源: 为了完成特定功能的SQL语句集 定义: 储存在数据库中, 用户通过指定储存过程的名字并给出参数(带有参数的)来执行它 声明: 储 ...

  5. MySQL储存过程详解

    我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的 ...

  6. mysql 储存过程

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...

  7. Mysql储存过程7: case

    #用在储存过程中: create procedure k() begin declare number int; )); case number then select '>0'; else s ...

  8. Mysql储存过程4:mysql变量设置

    默认全局变量是两个@@开头, 可用show variables查看所有默认变量: @@user #declare定义变量只能用在储存过程中 #declare 变量名 数据类型 可选类型 declare ...

  9. Mysql储存过程2:变量定义与参数传递

    #储存过程 中的变量定义 declare 变量名 类型 可选类型 -- 跟建表差不多 create procedure p() begin ); ; select age+number; end$ / ...

随机推荐

  1. 从文本中提取图片路径(java 解析富文本处理 img 标签)

    很多项目都需要到富文本来添加内容,就好比新闻啊,旅游景点之类的,都需要使用富文本去添加数据,然而怎么我这边就发现了两个问题 怎样将富文本的图片的 src 获取出来? 方法一: 利用正则表达式: pub ...

  2. Ehcache缓存配置以及基本使用

    在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS中取出来的高花费.高延迟采取的一种缓存方案.正因为Ehcache具有健壮性(基于java开发).被认证(具有apache 2.0 ...

  3. 使用vuejs2.0和element-ui 搭建的一个后台管理界面

    说明: 这是一个用vuejs2.0和element-ui搭建的后台管理界面. 相关技术: vuejs2.0:一套构建用户界面的渐进式JavaScript框架,易用.灵活.高效. element-ui: ...

  4. spring学习总结——介绍

    介绍:以下博客的内容都是依据<spring实战4>这本书.spring4.0 来总结. 一.spring作用 Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些功能的底 ...

  5. 商品描述里包含了英文双引号,ERP无法同步菜品信息

    1. 2.因菜品描述里包含英文双引号,破坏了json格式,导致json格式错乱,ERP无法解析,所以无法同步数据.

  6. 微信小程序中的循环遍历问题

    比如:如果在微信小程序中要遍历输出 0-9 的数,我们会使用for循环 ;i<;i++){ console.log(i); } 确实结果也是这样: 但是,如果我在循环时同时调用wx的api接口1 ...

  7. spring4笔记----web.xml中2.4以上版本Listener的配置

    基本上没用过Servlet2.4以下版本,所以2.4版本以下不必学了 <?xml version="1.0" encoding="UTF-8"?> ...

  8. Myeclipse2017C版本破解

    原文地址: https://blog.csdn.net/qq_33945246/article/details/79589152

  9. JavaScript getFullYear() 方法

    JavaScript Date 对象 定义和用法 getFullYear() 方法可返回一个表示年份的 4 位数字. 语法 dateObject.getFullYear() 返回值 当 dateObj ...

  10. win10上如何启用或禁用Windows功能

    Windows10上提供了很多的功能,比如打印服务.传真服务.媒体服务等,怎样启用或禁用某些Windows功能呢? 工具/原料   windows10 方法/步骤     点击左下角的Windows图 ...