MySQL - DECLARE ... HANDLER 语句
在 MySQL 中使用存储过程时,如果发生异常或导致过程执行突然终止,为了避免这种情况,您需要在 MySQL 中处理异常。
DECLARE ... HANDLER 语句
MySQL 提供了一个处理程序来处理存储过程中的异常。您可以使用 MySQL DECLARE ... HANDLER 语句声明一个处理程序来处理这些异常。
语法
以下是 MySQL HANDLER 语句的语法 -
DECLARE handler_action HANDLER FOR condition_value statement
handler_action
handler_action 是当给定条件满足时要执行的操作。您可以为处理程序操作提供以下值。
CONTINUE − 当前程序将继续执行该过程。
EXIT − 这将终止该过程的执行。
UNDO − InnoDB 不支持此操作。
condition_value
condition_value 是需要满足的条件,您可以传递多个条件值。您可以提供以下条件值。
mysql_error_code − 这是一个表示错误代码的整数文字。
sqlstate_value − 这是一个 5 个字符的字符串文字,用于指定 SQLSTATE 值。
condition_name − 使用 DECLARE ... CONDITION 指定的用户定义条件的名称。
SQLWARNING − SQLSTATE 的简写值以"01"开头。
NOT FOUND − SQLSTATE 的简写值以"02"开头。
SQLEXCEPTION − 用于指定的简写值异常。
示例
假设我们使用 CREATE 语句在 MySQL 数据库中创建了一个名为 tutorials 的表,如下所示 -
CREATE TABLE tutorials ( ID INT PRIMARY KEY, TITLE VARCHAR(100), AUTHOR VARCHAR(40), DATE VARCHAR(40) );
现在,我们将使用 INSERT 语句在教程表中插入 5 条记录 -
Insert into tutorials values (1, 'Java', 'Krishna', '2019-09-01'), (2, 'JFreeCharts', 'Satish', '2019-05-01'), (3, 'JavaSprings', 'Amit', '2019-05-01'), (4, 'Android', 'Ram', '2019-03-01'), (5, 'Cassandra', 'Pruthvi', '2019-04-06');
让我们创建另一个表来备份数据 -
CREATE TABLE backup ( ID INT, TITLE VARCHAR(100), AUTHOR VARCHAR(40), DATE VARCHAR(40) );
以下步骤演示了 HANDLER 语句的用法,它使用游标将教程表的内容备份到备份表中 -
DELIMITER //
CREATE PROCEDURE ExampleProc()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE tutorialID INTEGER;
DECLARE tutorialTitle, tutorialAuthor, tutorialDate VARCHAR(20);
DECLARE cur CURSOR FOR SELECT * FROM tutorials;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
label: LOOP
FETCH cur INTO tutorialID, tutorialTitle, tutorialAuthor,
tutorialDate;
INSERT INTO backup VALUES(tutorialID, tutorialTitle,
tutorialAuthor, tutorialDate);
IF done = 1 THEN LEAVE label;
END IF;
END LOOP;
CLOSE cur;
END//
DELIMITER ;
您可以像下面这样调用上述过程 -
CALL ExampleProc;
如果您验证备份表的内容,您可以看到插入的记录,如下所示 -
select * from backup;
输出
上述查询产生以下输出 -
| ID | TITLE | AUTHOR | DATE |
|---|---|---|---|
| 1 | Java | Krishna | 2019-09-01 |
| 2 | JFreeCharts | Satish | 2019-05-01 |
| 3 | JavaSprings | Amit | 2019-05-01 |
| 4 | Android | Ram | 2019-03-01 |
| 5 | Cassandra | Pruthvi | 2019-04-06 |

