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 语句在 tutorials 表中插入 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 语句的用法,它使用游标将 tutorials 表的内容备份到备份表:

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 标题 作者 日期
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-
广告
© . All rights reserved.