[MYSQL] 存储过程 动态表名/异常处理/事物回滚/日期

本文介绍了一个用于插入会员登陆信息的SQL存储过程,包括用户ID、用户名、用户类型和MD5ID的处理,以及相关事务管理和数据插入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- Name : insertMember
-- Description : 插入会员登陆member
-- Explain : 主服务器
-- IN : userid BIGINT(30),username VARCHAR(60),usernametype TINYINT(5),md5id CHAR(1)
-- OUT : 0 失败/1 成功/2 已存在


-- 定义结束符号为 $$
DELIMITER $$


-- 建立之前先检查是否存在,存在则删除
DROP PROCEDURE IF EXISTS `center`.`insertMember` $$

-- 创建一个存储过程名为insertMember


CREATE PROCEDURE `insertMember`(IN userid BIGINT(30),IN username VARCHAR(60),IN usernametype TINYINT(5),IN md5id CHAR(1))
BEGIN

-- 创建一个名为test的异常接收23000错误


  DECLARE `test` CONDITION FOR SQLSTATE '23000';

-- 当触发此异常时 退出并返回2
  DECLARE EXIT HANDLER FOR `test` SELECT 2;

-- 开始一个事物
  START TRANSACTION;
  INSERT INTO `member` (`pid`,`userName`,`usernameType`) VALUE (userid,username,usernametype);

-- 获取到插入时产生的ID赋值给一个临时变量
  SELECT @@Identity INTO @insertid;
  IF @insertid <= 0 THEN

-- 回滚嘛 只回滚当前ROLLBACK与TRANSACTION之间的操作
    ROLLBACK;
    SELECT 0;
  END IF;

-- 得到MD5计算出来的分表的表名
  SET @tab_name = CONCAT('`member_',md5id,'`');

-- 设置这个插入语句,由于表名是变量,所以必须用此方式
  SET @tempsql = CONCAT("INSERT INTO ",@tab_name," (`pid`,`userName`,`usernameType`) VALUE (",userid,",'",username,"',",usernametype,")");

 

-- 执行以上SQL,PREPARE stmt_name 的作用域是当前客户端连接会话可见。
  PREPARE mainStmt FROM @tempsql;
  EXECUTE mainStmt;
  SELECT @@Identity INTO @insertidan;
  IF @insertidan <= 0 THEN
    ROLLBACK;
  SELECT 0;
  END IF;

 

-- CURRENT_DATE,CURRENT_TIME取得日期时间后组合成字符串
  INSERT INTO `aaa` (`id`,`username`,`aaaUpdateDatetime`) VALUE (userid,username,CONCAT(CURRENT_DATE(),' ',CURRENT_TIME()));
  SELECT @@Identity INTO @insertcreditsid;
  IF @insertcreditsid <= 0 THEN
    ROLLBACK;
    SELECT 0;
  END IF;
  INSERT INTO `bbb` (`id`,`username`,`bbbUpdateDatetime`) VALUE (userid,username,CONCAT(CURRENT_DATE(),' ',CURRENT_TIME()));
  SELECT @@Identity INTO @insertexpsid;
  IF @insertexpsid <= 0 THEN
    ROLLBACK;
    SELECT 0;
  END IF;
  INSERT INTO `ccc` (`id`,`username`,`cccUpdateDatetime`) VALUE (userid,username,CONCAT(CURRENT_DATE(),' ',CURRENT_TIME()));
  SELECT @@Identity INTO @insertgold_coinsid;
  IF @insertgold_coinsid <= 0 THEN
    ROLLBACK;
    SELECT 0;
  END IF;


  INSERT INTO `sss` (`id`,`username`,`userType`,`sssDatetime`) VALUE (userid,username,usertype,CONCAT(CURRENT_DATE(),' ',CURRENT_TIME()));


  SELECT @@Identity INTO @insertmbpid;
  IF @insertmbpid <= 0 THEN
    ROLLBACK;
  SELECT 0;
  END IF;
  UPDATE `xxx` SET `aaa` = @insertcreditsid,`bbb`=@insertexpsid,`ccc`=@insertgold_coinsid WHERE `id`=userid;
  SELECT ROW_COUNT() INTO @updaterows;
  IF @updaterows <= 0 THEN
    ROLLBACK;
    SELECT 0;
  END IF;

-- 有始有终嘛 提交这个事物
  COMMIT;
  SELECT 1;

-- 结束存储过程
END $$


-- 定义结束符为";"号
DELIMITER ;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值