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

用存储过程把业务逻辑写在里面,确实是很方便的事情.但是维护的成本确实相对高了一些

以前专门做建站的,从来也没想过把什么东西写成存储过程.
前两天接了个项目,要写存储过程,好吧,虽然不难,但是刚一接触还是头大了一阵子
现在就拿出来闹闹事儿吧`~
是个很简单的存储过程 几个插入操作,一个分表插入操作 一个更新操作.
重复的注释没有写.
头一次写,见笑了.

  1. -- Name : insertMember
  2. -- Description : 插入会员登陆member
  3. -- Explain : 主服务器
  4. -- IN : userid BIGINT(30),username VARCHAR(60),usernametype TINYINT(5),md5id CHAR(1)
  5. -- OUT : 0 失败/1 成功/2 已存在
  6. -- 定义结束符号为 $$
  7. DELIMITER $$
  8. -- 建立之前先检查是否存在,存在则删除
  9. DROP PROCEDURE IF EXISTS `center`.`insertMember` $$
  10. -- 创建一个存储过程名为insertMember
  11. CREATE PROCEDURE `insertMember`(IN userid BIGINT(30),IN username VARCHAR(60),IN usernametype TINYINT(5),IN md5id CHAR(1))
  12. BEGIN
  13. -- 创建一个名为test的异常接收23000错误
  14.   DECLARE `test` CONDITION FOR SQLSTATE '23000';
  15. -- 当触发此异常时 退出并返回2
  16.   DECLARE EXIT HANDLER FOR `test` SELECT 2;
  17. -- 开始一个事物
  18.   START TRANSACTION;
  19.   INSERT INTO `member` (`pid`,`userName`,`usernameType`) VALUE (userid,username,usernametype);
  20. -- 获取到插入时产生的ID赋值给一个临时变量
  21.   SELECT @@Identity INTO @insertid;
  22.   IF @insertid <= 0 THEN
  23. -- 回滚嘛 只回滚当前ROLLBACK与TRANSACTION之间的操作
  24.     ROLLBACK;
  25.     SELECT 0;
  26.   END IF;
  27. -- 得到MD5计算出来的分表的表名
  28.   SET @tab_name = CONCAT('`member_',md5id,'`');
  29. -- 设置这个插入语句,由于表名是变量,所以必须用此方式
  30.   SET @tempsql = CONCAT("INSERT INTO ",@tab_name," (`pid`,`userName`,`usernameType`) VALUE (",userid,",'",username,"',",usernametype,")");
  31. -- 执行以上SQL,PREPARE stmt_name 的作用域是当前客户端连接会话可见。
  32.   PREPARE mainStmt FROM @tempsql;
  33.   EXECUTE mainStmt;
  34.   SELECT @@Identity INTO @insertidan;
  35.   IF @insertidan <= 0 THEN
  36.     ROLLBACK;
  37.   SELECT 0;
  38.   END IF;
  39. -- CURRENT_DATE,CURRENT_TIME取得日期时间后组合成字符串
  40.   INSERT INTO `aaa` (`id`,`username`,`aaaUpdateDatetime`) VALUE (userid,username,CONCAT(CURRENT_DATE(),' ',CURRENT_TIME()));
  41.   SELECT @@Identity INTO @insertcreditsid;
  42.   IF @insertcreditsid <= 0 THEN
  43.     ROLLBACK;
  44.     SELECT 0;
  45.   END IF;
  46.   INSERT INTO `bbb` (`id`,`username`,`bbbUpdateDatetime`) VALUE (userid,username,CONCAT(CURRENT_DATE(),' ',CURRENT_TIME()));
  47.   SELECT @@Identity INTO @insertexpsid;
  48.   IF @insertexpsid <= 0 THEN
  49.     ROLLBACK;
  50.     SELECT 0;
  51.   END IF;
  52.   INSERT INTO `ccc` (`id`,`username`,`cccUpdateDatetime`) VALUE (userid,username,CONCAT(CURRENT_DATE(),' ',CURRENT_TIME()));
  53.   SELECT @@Identity INTO @insertgold_coinsid;
  54.   IF @insertgold_coinsid <= 0 THEN
  55.     ROLLBACK;
  56.     SELECT 0;
  57.   END IF;
  58.   INSERT INTO `sss` (`id`,`username`,`userType`,`sssDatetime`) VALUE (userid,username,usertype,CONCAT(CURRENT_DATE(),' ',CURRENT_TIME()));
  59.   SELECT @@Identity INTO @insertmbpid;
  60.   IF @insertmbpid <= 0 THEN
  61.     ROLLBACK;
  62.   SELECT 0;
  63.   END IF;
  64.   UPDATE `xxx` SET `aaa` = @insertcreditsid,`bbb`=@insertexpsid,`ccc`=@insertgold_coinsid WHERE `id`=userid;
  65.   SELECT ROW_COUNT() INTO @updaterows;
  66.   IF @updaterows <= 0 THEN
  67.     ROLLBACK;
  68.     SELECT 0;
  69.   END IF;
  70. -- 有始有终嘛 提交这个事物
  71.   COMMIT;
  72.   SELECT 1;
  73. -- 结束存储过程
  74. END $$
  75. -- 定义结束符为";"号
  76. DELIMITER ;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值