MySQL - 遊標 OPEN 語句



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

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

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

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

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

    這意味著,如果我們建立了一個包含表中所有記錄的遊標,而與此同時,如果我們向表中新增更多記錄,這些最新的更改將不會反映在我們之前獲得的遊標中。

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

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

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

遊標 OPEN 語句

此語句用於開啟前面宣告的遊標。OPEN 語句初始化遊標的結果集,因此我們必須在從結果集中提取行之前呼叫 OPEN 語句。

語法

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

OPEN cursor_name;

示例

假設我們建立了一個名為 dispatches 的表,如下所示:

CREATE TABLE Dispatches( Product_Name VARCHAR(255), 
Name_Of_Customer VARCHAR(255), Month_Of_Dispatch VARCHAR(255), 
Price INT, Location VARCHAR(255));

讓我們使用 INSERT 語句向其中插入 5 條記錄。

Insert into dispatches values
('Key-Board', 'Raja', TIMESTAMP('2019-05-04', '15:02:45'), 7000, 
'Hyderabad'),
('Earphones', 'Roja', TIMESTAMP('2019-06-26', '14:13:12'), 2000, 
'Vishakhapatnam'),
('Mouse', 'Puja', TIMESTAMP('2019-12-07', '07:50:37'), 3000, 
'Vijayawada'),
('Mobile', 'Vanaja' , TIMESTAMP ('2018-03-21', '16:00:45'), 9000, 
'Chennai'),
('Headset', 'Jalaja' , TIMESTAMP('2018-12-30', '10:49:27'), 6000, 
'Goa');

如果您驗證上面建立的表的內容,您可以觀察到插入的記錄如下:

SELECT * FROM Dispatches;

輸出

上面的 mysql 查詢生成以下輸出:

產品名稱 客戶姓名 發貨月份 價格 地點
鍵盤 Raja 2019-05-04 15:02:45 7000 海德拉巴
耳機 Roja 2019-06-26 14:13:12 2000 維沙卡帕特南
滑鼠 Puja 2019-12-07 07:50:37 3000 維傑亞瓦達
手機 Vanaja 2018-03-21 16:00:45 9000 欽奈
耳機 Jalaja 2018-12-30 10:49:27 6000 果阿

下面的查詢建立一個儲存過程,該過程檢索 Product_Name 和 location。在這裡,我們使用兩個 OUT 引數來儲存這些值:

DELIMITER //
Create procedure cursorExample (INOUT list VARCHAR(5000))
   BEGIN
      DECLARE val INT DEFAULT FALSE;
      DECLARE prodName VARCHAR(150) DEFAULT "";
      DECLARE cur CURSOR FOR SELECT Product_Name FROM Dispatches;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET val = TRUE;
      OPEN cur;
         REPEAT
            FETCH cur INTO prodName;
            SET list = CONCAT(prodName, ", ", list);
            UNTIL val = 1
         END REPEAT;
      CLOSE cur;
      END //
DELIMITER ;

您需要透過傳遞一個變數來呼叫此過程,並且可以使用 SELECT 語句從中檢索值。

SET @products="";
CALL cursorExample(@products);
SELECT @products;

輸出

以下是上述查詢的輸出:

@products
耳機, 耳機, 手機, 滑鼠, 耳機, 鍵盤,
廣告