美文网首页
存储过程(根据传入字段,来操作数据表)

存储过程(根据传入字段,来操作数据表)

作者: 杨森Janssen | 来源:发表于2018-10-25 16:17 被阅读17次

自己做个备忘记录

1.需求:

根据传入的字段查询,给查询的表添加锁,查询不允许更新,
更新成功后添加添加详细。

2,。需要用到表锁,事务,拼装sql语句执行

CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`(IN `i_field` varchar(32),IN `i_uid` varchar(32),IN `i_amount` varchar(32),IN `i_source` varchar(255),IN `i_attach` varchar(1000),OUT `o_status` tinyint,OUT `msg` varchar(1000))
Label_end:
BEGIN
    #i_field 请求user_wallet的字段,i_uid用户uid,i_amount 变化的金额,i_source为插入钱包source字段数据,i_attach为插入钱包attach字段json数据
    DECLARE num_error TINYINT default 0;
    #sql语句出错时num_error赋值为1
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET num_error = 1;  
    IF ((i_field REGEXP 'balance|coin|lvbao|disposit') = 0) THEN
    #没有该字段(字段限制)
        SET msg = '请填写正确的字段';
        SET o_status = 0;
        LEAVE label_end;
    END IF;

    IF (i_amount= 0) THEN
        SET o_status = 0;
        SET msg = '输入金额不能为0';
        LEAVE label_end;
    END IF;

    select COUNT(*) from user_permission where uid = i_uid AND freeze_status != 0;
    IF (FOUND_ROWS() = 0) THEN
    #--钱包冻结
        SET o_status = 0;
        SET msg = '钱包被冻结';
        LEAVE label_end;
    END IF;
    
    #查询并锁表(查询完毕之前不能更新该数据)
    SELECT * FROM user_wallet WHERE uid = i_uid FOR UPDATE;
    IF (FOUND_ROWS() = 0) THEN
    #--没有用户信息
        SET o_status = 0;
        SET msg = '没有用户';
        LEAVE label_end;
    END IF;
    
    START TRANSACTION;

    #执行拼装的sql语句
    SET @sql_concat = CONCAT('update user_wallet set ', i_field, " = ", i_field," + ", i_amount," where uid = '", i_uid, "'");
    PREPARE presql FROM @sql_concat;
    EXECUTE presql;
    #影响行数不能加在DEALLOCATE PREPARE presql; 后面,不然不能获取到影响行数
    IF (ROW_COUNT() < 1 ) THEN
            #当sql语句出错时, 为-1
            SET o_status = 0;
            SET msg = '更新钱包失败';
            SET num_error = num_error + 1;
    END IF;
    DEALLOCATE PREPARE presql;
    
    #拼装sql语句不能赋值给局部变量,可以赋值给用户变量
    SET @sql_concat = CONCAT('select ', i_field, " INTO @field_total from user_wallet where uid = '", i_uid, "'");
    PREPARE presql FROM @sql_concat;
    EXECUTE presql; 
    DEALLOCATE PREPARE presql;
    
    SET @sql_concat = CONCAT('insert into user_wallet_', i_field, "_detail(uid, value, remain, source, attach) values ('",i_uid, "','", i_amount, "','", @field_total, "','", i_source, "','", i_attach, "')");
    PREPARE presql FROM @sql_concat;
    EXECUTE presql;
    IF (ROW_COUNT() < 1 ) THEN
            #当sql语句出错时, 为-1
            SET o_status = 0;
            SET msg = '插入详细失败';
            SET num_error = num_error + 1;
            LEAVE label_end;
    END IF;
    DEALLOCATE PREPARE presql;
    SET @field_total = 0;
    
    IF (num_error > 0) THEN
        ROLLBACK;
        LEAVE label_end;
    ELSE
        #不发生错误,切能成功插入,和更新
        COMMIT;
    END IF;
    
    SET o_status = 1;
    SET msg = '操作成功';
        

END;

相关文章

  • 存储过程(根据传入字段,来操作数据表)

    自己做个备忘记录 1.需求: 根据传入的字段查询,给查询的表添加锁,查询不允许更新,更新成功后添加添加详细。 2,...

  • MySql存储过程

    创建简单的存储过程 创建一个存储过程,通过传入一个id和一个name参数,可以根据所传入的id值来更改name 删...

  • 7.修改数据表

    针对字段操作:添加/删除字段,修改列定义,列名 针对约束操作:添加/删除 针对数据表操作:数据表更名(rename...

  • MySQL的数据表操作

    数据表操作 每一张数据表都相当于一个文件,在数据表中又分为表结构与表记录。 表结构:包括存储引擎,字段,主外键类型...

  • MySQL基础知识一

    数据库操作、数据表操作、字段操作总结 思维导图总结:

  • 数据库方向开发日志-Week1

    BACKEND TODO: 数据表设计及初始化数据库操作轮子重构 我们根据实际需求设计了数据表及字段,并规范了表之...

  • MongoDB 数据类型查询 — $type使用

    MongoDB 使用过程中经常需要根据字段的类型来查询数据, 而MongoDB中查询字段类型是通过$type操作符...

  • Flask数据表时间字段的比较

    Mysql数据表中存储了一个时间字段,如start_time,类型是time通过程序从数据表获取其值的类型是tim...

  • Python 高级 14(2)数据库增删改查

    数据表操作、DDL 数据表的增删改、DML 数据表中数据的增删改、MySQL 常用字段类型 2.4 数据表操作 学...

  • mysql 每月自动创建分区

    每月自动创建分区逻辑,通过创建一个事件定时任务去执行存储过程数据表结构,分区字段必须是主键索引中的字段,这里用时间...

网友评论

      本文标题:存储过程(根据传入字段,来操作数据表)

      本文链接:https://www.haomeiwen.com/subject/zorqtqtx.html