用存储过程把业务逻辑写在里面,确实是很方便的事情.但是维护的成本确实相对高了一些
以前专门做建站的,从来也没想过把什么东西写成存储过程.
前两天接了个项目,要写存储过程,好吧,虽然不难,但是刚一接触还是头大了一阵子
现在就拿出来闹闹事儿吧`~
是个很简单的存储过程 几个插入操作,一个分表插入操作 一个更新操作.
重复的注释没有写.
头一次写,见笑了.
- -- 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 ;