PROCEDURE

抢劵

DROP PROCEDURE coupon_rush;
CREATE PROCEDURE coupon_rush
    (in v_coupon_id bigint,         -- 优惠劵id
     in v_user_id bigint,           -- 用户id
     in v_status int,                              -- 状态
     in v_rush_time timestamp,      -- 抢劵时间
     out r_result int)
BEGIN
      DECLARE temp_insert_count int DEFAULT 0;   -- 修改记录
          DECLARE temp_rush_id int DEFAULT 0;        -- 抢劵id
          DECLARE temp_is_rush_sign int DEFAULT 0;   -- 是否抢劵   0-非  1-是
      DECLARE temp_is_free_sign int DEFAULT 1;     -- 是否收费   0-收费  1-免费
      DECLARE temp_buy_times int DEFAULT 0;      -- 限购次数
      DECLARE temp_rushed_num int DEFAULT 0;     -- 已抢个数
      DECLARE temp_coupon_use_type int DEFAULT 0;-- 优惠劵类型 1-优惠券 2-优惠码 3-优惠券+优惠码
      START TRANSACTION;

            -- 0.检查优惠劵类型
      SELECT is_rush,is_free,buy_times,use_type
            INTO temp_is_rush_sign,temp_is_free_sign,temp_buy_times,temp_coupon_use_type
            from pd_coupon where id = v_coupon_id;
            -- IF (temp_is_rush_sign = 0) THEN
            --         set r_result = -1;                   -- 非抢劵 (-1)
      IF (temp_coupon_use_type = 2) THEN
                    set r_result = -7;                     -- 不支持优惠码(-7)
            ELSE

                    -- 0.检查领取数量(免费一张, 收费多张)
                    SELECT COUNT(*) INTO temp_rushed_num
                    from pd_coupon_rush
                    where user_id = v_user_id and coupon_id = v_coupon_id and status != 3;  -- 排除已经撤销的抢劵
                  IF(temp_is_free_sign = 1 AND temp_rushed_num > 0) THEN
                            ROLLBACK;
                            set r_result = -6;    -- 不可多抢(-6)
                    ELSEIF(temp_is_free_sign = 0 AND temp_rushed_num >= temp_buy_times) THEN
                            ROLLBACK;
                          set r_result = -6;    -- 不可多抢(-6)
                    ELSE

                                -- 1.记录明细
                                insert into pd_coupon_rush
                                    (user_id, coupon_id, status, created_time, updated_time)
                                values
                                    (v_user_id, v_coupon_id, v_status, v_rush_time, v_rush_time);
                                SELECT LAST_INSERT_ID() INTO temp_rush_id; -- 获取自增ID
                                select row_count() into temp_insert_count;
                                IF (temp_insert_count = 0) THEN                       -- 记录明细失败(-2)
                                    ROLLBACK;
                                    set r_result = -2;
                                ELSEIF (temp_insert_count < 0) THEN              -- 记录明细系统异常(-3)
                                    ROLLBACK;
                                    set r_result = -3;
                                ELSE  

                                            -- 2.减库存
                                            UPDATE
                                                pd_coupon
                                            SET remain_num = remain_num - 1
                                            WHERE
                                                use_type = 1
                                            -- AND is_rush = 1       --支持优惠劵, 码加劵
                                            AND remain_num>0
                                            AND code_start_time < v_rush_time
                                            AND code_end_time > v_rush_time
                                            AND `status` = 0
                                            AND preheat = 0
                                            AND is_recom = 0
                                            AND is_lottery = 0;

                                            select row_count() into temp_insert_count;
                                            IF (temp_insert_count = 0) THEN                  -- 减库存失败, 抢劵结束 (-4)
                                                ROLLBACK;
                                                set r_result = -4;
                                            ELSEIF (temp_insert_count < 0) THEN          -- 减库存失败, 系统异常 (-5)
                                                ROLLBACK;
                                                set r_result = -5;
                                            ELSE                                                              -- 减库存成功(主键id)
                                                COMMIT;
                                                set r_result = temp_rush_id;
                                            END IF;

                                END IF;
                    END IF;
          END IF;
END;
时间: 2024-08-23 09:53:16

PROCEDURE的相关文章

[转]delphi的procedure of object

delphi的procedure of object(一个特殊的指针类型) 理论:     //适用于实现不是某一特定过程或函数          type                TNotifyEvent = procedure(Sender: TObject) of object;       首先:procedure 也是类型,可以理解为过程类型,定义过程的参数结构,而具体的实现可以动态赋值  onclick那样例子:      声明:  onclick= procedure(Sen

EntityFramework 学习 一 Stored Procedure

CREATE PROCEDURE [dbo].[GetCoursesByStudentId] -- Add the parameters for the stored procedure here @StudentId int = null AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Inse

SQL procedure User&#39;s Guide

1. Ordering the SELECT Statement: 1.select 2. From 3. Where 4. Group by 5. Having 6. Order by select Continent, sum(Population) from sql.countries group by Continent having Continent in ('Asia', 'Europe') order by Continent; 2. The OUTOBS=option limi

项目中js调用service和procedure的办法

Ajax.js 1 /**通用ajax服务的定义对象 2 3 * services可以是单个服务对象,也可以是service服务数组 4 * 具体服务的定义请参考appendServices成员函数 5 */ 6 function Service(services){ 7 this.services=[]; 8 this.shareParameters={}; 9 /**添加共享参数,在这里统一设置共享参数 10 */ 11 this.addShareParameters=function(sh

Procedure 存储过程

本文非原创 存储过程是数据库当中最高级的应用程序,可以传递参数和返回相应的值. 1.分为:系统存储过程和自定义存储过程 定义:它是由一系列的预编译的SQL语句和流程控制语句组成的, 具有参数的传递.条件的判断.变量的声明.返回处理结果, 并扩充了SQL语句的功能. 优点:(1)使用它可以比单独使用SQL语句实现更复杂的功能. (2)它的执行速度要比普通的SQL语句执行的速度要快. 缺点:(1)不能实现复杂的逻辑操作,因为它不能提供复杂的程序设计. (2)存储过程创建后,管理较困难,需要记住每个过

sql: Oracle 11g create procedure

CREATE OR REPLACE PROCEDURE proc_Insert_BookKindList ( temTypeName nvarchar2, temParent int ) AS ncount number; begin --SELECT COUNT (*) INTO ncount FROM BookKindList fm1 where EXISTS (SELECT BookKindName from BookKindList fm2 where fm2.BookKindName=

[独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure、function、Sequence

本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table.View [独孤九剑]Oracle知识点梳理(七)数据库常用对象之Cursor [独孤九剑]Oracle知识点梳理(八)常见Exception [独孤九剑]Oracle知识点梳理(九)数

Delphi 中的 procedure of object

其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型的定义,他定义了一个可以在类中使用的函数类型区别于type TMyProc = procedure; TMyEvent 和 TMyProc 都定义了一个函数类型,他们的差别是,TMyProc 不可以用在类中定义事件,TMyEvent 却可以. 如果你想知道问什么,那就需要深入了解事件类型以及函数类型

Oracle procedure 基本语法

转自:http://lorry1113.javaeye.com/blog/513851 关键字: oracle 存储过程 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 (     参数1 IN NUMBER,     参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT   将select查询的结果存入到变量中,可以同时将多个列存储多个变量

Calling a PL/SQL procedure in ODI

新建procedure 新建一个测试表格EMP: CREATE TABLE EMP ( EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2) ); 新建一个procedure,往EMP表插入一条记录 CREATE OR R