免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3183 | 回复: 0
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-28 17:17 |只看该作者 |倒序浏览

                                                                                                                                以前专门做建站的,从来也没想过把什么东西写成存储过程.
前两天接了个项目,要写存储过程,好吧,虽然不难,但是刚一接触还是头大了一阵子
现在就拿出来闹闹事儿吧`~
是个很简单的存储过程 几个插入操作,一个分表插入操作 一个更新操作.
重复的注释没有写.
头一次写,见笑了.
               
               
                -- 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 ;
以后学了新东西  再拿出来分享  ^_^
文中说的SQLSTATE '23000'可以用查手册的附录里有对应的错误消息号的对应
例如: 1062 唯一值 对应的 SQLSTATE就是 23000
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/105169/showart_2081317.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP