MySQL - 处理程序的作用域规则
在 MySQL 中使用存储过程时,如果发生异常或导致过程执行突然终止,为了避免这种情况,您需要在 MySQL 中处理异常。
MySQL 提供了一个处理程序来处理存储过程中的异常。您可以使用 MySQL DECLARE ... HANDLER 语句声明处理程序来处理这些异常。
示例
假设我们已经使用 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 |
处理程序的作用域规则
以下是处理程序的作用域规则 -
声明的处理程序的作用域仅限于块中处理程序声明之后的语句。
如果在特定块中声明处理程序,则其作用域仅限于创建该处理程序的块。您无法为其外部的条件激活它。
您可以定义两种类型的处理程序:特定处理程序(MySQL 错误代码、SQLSTATE 值或条件名称)和通用处理程序(SQLWARNING、SQLEXCEPTION 或 NOT FOUND 类中的条件)。
以下是各种类型处理程序的优先级。
MySQL error code handler-> SQLSTATE value handler-> SQLEXCEPTION -> general SQLWARNING-