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;
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;
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;
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
DECLARE code CHAR(5) DEFAULT '00000';
DECLARE msg TEXT;
DECLARE rows INT;
DECLARE result TEXT;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
END;
START TRANSACTION ;
returnOk:begin
INSERT INTO test_table (id) VALUES(value);
IF code != '00000' THEN
LEAVE returnOk;
END IF;
INSERT INTO test_table (id) VALUES(2);
end returnOk;
IF code = '00000' THEN
GET DIAGNOSTICS rows = ROW_COUNT;
SET result = CONCAT('insert succeeded, row count = ',rows);
COMMIT;
ELSE
SET result = CONCAT('insert failed, error = ',code,', message = ',msg);
ROLLBACK;
END IF;
SELECT result;
END $$
CALL test_insert(1);