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-
廣告