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 是在滿足給定條件時要執行的操作。您可以為 handler_action 提供以下值。

  • CONTINUE - 程式將繼續執行過程。

  • EXIT - 這將終止過程的執行。

  • UNDO - InnoDB 不支援此操作。

condition_value

condition_value 是要滿足的條件,您可以傳遞多個條件值。您可以為條件值提供以下值。

  • mysql_error_code - 表示錯誤程式碼的整數文字。

  • sqlstate_value - 指定 SQLSTATE 值的 5 個字元的字串文字。

  • 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 語句在 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 標題 (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
廣告