MySQL 遊標



MySQL 遊標

MySQL 遊標是一個指標,用於迭代表的記錄。它們用於儲存程式(如過程和函式)中,並具有以下特性:

  • 只讀 - 遊標只允許讀取資料;不能對其進行修改。

  • 不可滾動 - 遊標只能單向移動記錄,從上到下。

  • 敏感 - 遊標對錶中所做的更改敏感。對錶所做的任何修改都將反映在遊標中。

以下四個操作用於在 MySQL 中管理遊標

  • 宣告遊標

  • 開啟遊標

  • 獲取遊標

  • 關閉遊標

現在讓我們詳細瞭解每個操作。

宣告遊標

DECLARE 語句用於在 MySQL 中宣告遊標。聲明後,它將與 SELECT 語句關聯,以從表中檢索記錄。

以下是宣告遊標的語法:

DECLARE cursor_name CURSOR FOR select_statement;

開啟遊標

OPEN 語句用於在宣告遊標後初始化遊標以檢索資料。

以下是開啟遊標的語法:

OPEN cursor_name;

獲取遊標

FETCH 語句用於檢索遊標指向的記錄。檢索後,遊標將移動到下一條記錄。

以下是獲取遊標的語法:

FETCH cursor_name INTO variable_list;

關閉遊標

CLOSE 語句用於在檢索所有記錄後釋放與遊標關聯的記憶體。

以下是關閉遊標的語法:

CLOSE cursor_name;

示例

在此示例中,我們將看到如何在儲存過程中管理遊標。

假設使用 CREATE TABLE 語句建立了兩個表 CUSTOMERS 和 BACKUP。CUSTOMERS 表儲存 ID、姓名、年齡、地址和工資等資訊,如下所示:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

現在,我們正在建立 BACKUP 表,其結構與 CUSTOMERS 表相同,用於儲存 CUSTOMERS 表記錄的副本:

CREATE TABLE BACKUP (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2)
);

現在讓我們使用 INSERT 語句將一些記錄插入到 CUSTOMERS 表中,如下所示:

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

以下 SQL 查詢在 CUSTOMERS 表上建立一個遊標:

DECLARE MY_CURSOR CURSOR FOR SELECT * FROM CUSTOMERS;

現在,我們正在建立一個名為 ExampleProc 的儲存過程來管理從宣告到關閉的遊標:

DELIMITER //
CREATE PROCEDURE ExampleProc()
   BEGIN
      -- Variable declarations
      DECLARE done INT DEFAULT 0;
      DECLARE cust_id, cust_age INTEGER;
      DECLARE cust_name VARCHAR(20);
      DECLARE cust_address CHAR(25);
	  DECLARE cust_salary DECIMAL(18,2);
	  
	  -- Cursor declaration
      DECLARE cur CURSOR FOR SELECT * FROM CUSTOMERS;
	  
	  -- Handler for no more records
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
	  
	  -- Open the cursor
      OPEN cur;
	  
      -- Loop to fetch and insert records
      label: LOOP
      FETCH cur INTO cust_id, cust_name, cust_age, cust_address, cust_salary;
      INSERT INTO backup VALUES(cust_id, cust_name, cust_age, cust_address, cust_salary);
      IF done = 1 THEN LEAVE label;
      END IF;
      END LOOP;
	  
	  -- Close the cursor
      CLOSE cur;
   END//
DELIMITER ;

輸出

最後,如果我們使用 CALL ExampleProc(); 呼叫該過程並檢查 BACKUP 表的內容,它將包含與 CUSTOMERS 相同的記錄:

SELECT * FROM BACKUP;

獲得的 BACKUP 表如下:

ID 姓名 年齡 地址 工資
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00
7 Muffy 24 Indore 10000.00
廣告