m0_50774522 2022-04-30 19:31 采纳率: 40%
浏览 354
已结题

【MySQL】存储过程-购买游戏装备

#创建存储过程buy,实现游戏装备的购买。业务逻辑:用户购买游戏装备,首先检查余额是否充足,购买成功后,用户信息表游戏币数值减少,装备表如果已有该装备,则装备数+1, 否则装备表添加记录(数目为1), 要么一起成功,要么一起失败

CREATE PROCEDURE buy(

    IN ID_user int,       ##用户编号

    IN ID_device int,    ##装备编号

    out s_result  nchar(30)  ##支付结果: DONE |  Error occurred – terminating | incorrect parameter| insufficient 

)

BEGIN

END

重要提示:支付结果只能是 DONE、Error occurred – terminating、incorrect parameter、insufficient balance中的一种,成功的提示为DONE

以下是数据:

##CREATE DATABASE shopping DEFAULT CHARACTER SET utf8;

##SET @@autocommit = 0; -- 1代表自动提交,0代表手动提交

##事务的执行过程

##1、start transaction,开始事务。

##2、执行insert、update、delete的sql语句。

##3、如果sql语句执行失败,可手动rollback回滚事务,否则执行commit提交事务。

/*打开数据库 */

##use shopping

CREATE TABLE user(

ID INT PRIMARY KEY comment '用户账号',

name NCHAR(50) NOT NULL comment '用户名称',

coins int comment '游戏币余额'

);

insert into user values( 1998, 'ADa', 60 );

insert into user values( 1999, 'batman', 30 );

insert into user values( 2001, 'Fa– Mulan', 500 );

CREATE TABLE device(

ID INT PRIMARY KEY comment '装备编号',

desc_deveice NCHAR(200) NOT NULL comment '装备描述',

price int comment '价格'

);

insert into device values(587, '血滴子, 可提高体力', 10);

insert into device values(254, '制式大刀, 普通材质', 5);

CREATE TABLE user_device(

IDofuser INT comment '用户编码',

IDofdevice INT comment '装备编码',

qty smallint default 1 comment '用户拥有该装备的数量',

primary key (IDofuser, IDofdevice)

);

insert into user_device values(1998, 587, 10 );

insert into user_device values(1998, 254, 1 );

insert into user_device values(2001, 254, 2 );

[注意:SQL表名请用小写]

  • 写回答

1条回答 默认 最新

  • littlerubyworld 2022-04-30 20:22
    关注
    
    DELIMITER @@
    CREATE  PROCEDURE  buy(
            IN ID_user INT,
            IN ID_device INT,
            OUT s_result  NCHAR(30)  ##支付结果: DONE |  Error occurred – terminating | incorrect parameter| insufficient 
    ) 
    BEGIN
         DECLARE icoins INT;
        DECLARE iprice INT;
        DECLARE EXIT HANDLER FOR SQLEXCEPTION
         BEGIN
            signal SQLSTATE '45000' SET message_text='消费不成功';
            ROLLBACK;
        END;
        SET icoins = (SELECT coins FROM `user` WHERE ID=ID_user);
        SET iprice = (SELECT price FROM device WHERE ID=ID_device);
        IF iprice > icoins THEN
            signal SQLSTATE '45000' SET message_text='消费不成功';
        END IF;
        START TRANSACTION;
        UPDATE `user` SET coins=coins-iprice WHERE ID=ID_user;
        IF EXISTS(SELECT * FROM user_device WHERE IDofuser=ID_user AND IDofdevice=ID_device) THEN
            UPDATE user_device SET qty=qty+1 WHERE IDofuser=ID_user AND IDofdevice=ID_device;
        ELSE
            INSERT INTO user_device(IDofuser,IDofdevice) VALUES(ID_user,ID_device);
        END IF;
        SET s_result='DONE';
        COMMIT;
    END@@
    DELIMITER ;
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月30日
  • 已采纳回答 4月30日
  • 赞助了问题酬金10元 4月30日
  • 创建了问题 4月30日

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP