mysql存储过程循环、事务以及异常处理示例

1. 简单的循环、事务、异常处理示例
-- 创建测试表
create TABLE test_table(
	id int(11),
	vpoints int(11),
	PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

-- 删除存储过程
DROP PROCEDURE IF EXISTS testProcedure;

-- 创建存储过程
DELIMITER $$
CREATE PROCEDURE testProcedure()
BEGIN
	DECLARE id VARCHAR(36); 				-- 主键
	DECLARE vpoints INTEGER;				-- 积分
	DECLARE nowTime TIMESTAMP; 				-- 服务器时间
	DECLARE result_code INTEGER DEFAULT 0; 	-- 定义异常并赋初值0
  DECLARE done INT DEFAULT FALSE; 			-- 遍历数据结束标志

	-- 游标
  DECLARE cur_info CURSOR FOR SELECT id, vpoints FROM test_table;

  -- 将结束标志绑定到游标
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	-- 在执行过程中出任何异常设置result_code为1
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET result_code=1;
	-- 打开游标
  OPEN cur_info;   
	-- 开启事务
	START TRANSACTION;
	-- 遍历
  loop_label: LOOP
			-- 取值 取多个字段
      FETCH NEXT from cur_info INTO id, vpoints;
			
			 -- 是否执行完毕(跳出循环)
			 IF done THEN 
				 LEAVE loop_label;
			 END IF;

			-- 业务处理
			-- 使用id和vpoints处理业务逻辑

  END LOOP;

	-- 异常回滚,否则提交
  IF result_code = 1 THEN 
		 SELECT 'SQL异常,数据已回滚';
	 	 ROLLBACK; 
	ELSE 
		 COMMIT;
  END IF;
	SELECT result_code;
END $$

-- 调用存储过程
CALL testProcedure();
2. 简单事务处理和异常捕获处理
DROP PROCEDURE  IF  EXISTS  test_insert;

DELIMITER $$
CREATE PROCEDURE test_insert(value INT)
BEGIN
	-- 定义异常code
	DECLARE code CHAR(5) DEFAULT '00000';
  	-- 定义异常msg
 	 DECLARE msg TEXT;
  	-- 定义sql处理返回行数
  	DECLARE rows INT;
  	-- 定义返回结果
  	DECLARE result TEXT;
  	-- 声明异常处理
  	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
        BEGIN
          -- 获取异常code,异常信息
          GET DIAGNOSTICS CONDITION 1
            code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
        END;

  	-- 开启事务
	START TRANSACTION ;

	-- 定义跳出存储过程标记 (配合异常跳出)
	returnOk:begin 

        -- 执行插入语句1
        INSERT INTO test_table (id) VALUES(value);

        -- 判断语句1是否异常
        IF code != '00000' THEN 
            LEAVE returnOk; 
        END  IF;

        -- 执行插入语句2
        INSERT INTO test_table (id) VALUES(2);

    end returnOk;

	-- 检查code是否改变,如果改变表示插入异常了
    IF code = '00000' THEN
    	GET DIAGNOSTICS rows = ROW_COUNT;
        SET result = CONCAT('insert succeeded, row count = ',rows);
       	COMMIT;
    ELSE
        -- 复制异常code,异常信息
        SET result = CONCAT('insert failed, error = ',code,', message = ',msg);
        ROLLBACK;
    END IF;

    -- 输入执行结果
    SELECT result;
END $$

CALL test_insert(1);

你可能感兴趣的:(java相关解决方案,Mysql相关,数据库解决方案)