MySQL - 遊標 DECLARE 語句



資料庫中的遊標是一種允許您迭代/遍歷表記錄的構造。在 MySQL 中,您可以在儲存程式(例如過程、函式等)中使用遊標。

換句話說,您可以使用遊標從 MySQL 儲存程式迭代表記錄。MySQL 提供的遊標是嵌入式遊標。

  • 只讀 - 使用這些遊標,您無法更新任何表。

  • 不可滾動 - 使用這些遊標,您可以從上到下在一個方向上從表中檢索記錄。

  • 不敏感 - 這些遊標對錶中所做的更改不敏感,即對錶所做的修改不會反映在遊標中。

    這意味著如果我們建立了一個包含表中所有記錄的遊標,並且與此同時如果我們向表中添加了更多記錄,那麼這些最近的更改將不會反映在我們先前獲得的遊標中。

在儲存程式中宣告遊標時,您需要確保這些(遊標宣告)始終遵循變數和條件宣告。

要使用遊標,您需要按照以下步驟操作(按相同的順序)

  • 使用 DECLARE 語句宣告遊標。
  • 宣告變數和條件。
  • 使用 OPEN 語句開啟已宣告的遊標。
  • 使用 FETCH 語句從表中檢索所需記錄。
  • 最後使用 CLOSE 語句關閉遊標。
CLOSE

DECLARE 語句

使用 DECLARE 語句,您可以宣告一個遊標並將其與 SELECT 語句關聯,該語句從表中獲取所需的記錄。與遊標關聯的此 SELECT 語句不允許使用 INTO 子句。

宣告遊標後,您可以使用 FETCH 語句從中檢索記錄。您需要確保遊標宣告在處理程式宣告之前。您可以在單個儲存程式中建立使用遊標。

語法

以下是 MySQL 遊標 DECLARE 語句的語法:

DECLARE cursor_name CURSOR FOR select_statement;

示例

假設我們使用 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)
);

以下過程使用遊標將 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
廣告