下面是一个存储过程的基本用法,以及存储过程中使用事务,防止数据混乱,保持数据一致性
下面这个存储过程主要涉及的几个知识部分:
1、动态拼装表名称
2、在存储过程内容获取查询结果并赋值给一个新属性
3、if else判断
用到的数据表
创建存储过程:
CREATE DEFINER=`root`@`localhost` PROCEDURE `update_student_info`(IN fromName VARCHAR(50),IN id INT(32),out error int)
BEGIN
DECLARE updateSql VARCHAR(200);
DECLARE t_error INTEGER DEFAULT 0;
#捕获到sql的错误,就设置t_error为1
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
#开启事务
START TRANSACTION;
set @sqlStr=CONCAT('SELECT stu_sex INTO @tempSex FROM ',fromName,' where id=',id);
PREPARE stmt from @sqlStr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
#获取查询参数值
if @tempSex ='男' then
set updateSql=CONCAT("UPDATE ",fromName," set score=80 where id=",id);
ELSE
set updateSql=CONCAT("UPDATE ",fromName," set score=86 where id=",id);
end if;
# 更改学生成绩
set @sqlUpdate=updateSql;
PREPARE stmt from @sqlUpdate;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
#下面这行是我写的一个错误查询,如果把它注释打开,那么事务就会执行回滚,这里主要用于事务是否有效
#SELECT * from student1;
#如果捕获到错误
IF t_error=1 THEN
#回滚
set error=1;
ROLLBACK;
ELSE
#提交
set error=0;
COMMIT;
END IF;
SELECT error;
END
执行存储过程:
call update_student_info('student',3,@error);
输出error结果为0,代表正常执行成功;如果error为1,代表执行失败,事务回滚