久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何在mysql存儲過程中使用游標

177次閱讀
沒有評論

共計 2606 個字符,預計需要花費 7 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

本篇文章給大家分享的是有關如何在 mysql 存儲過程中使用游標,丸趣 TV 小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。

在處理存儲過程中的結果集時,可以使用游標,因為游標允許我們迭代查詢返回的一組行,并相應地處理每行。mysql 的游標為只讀,不可滾動和敏感三種模式,我們來看下:

只讀:無法通過光標更新基礎表中的數據。

不可滾動:只能按照 select 語句確定的順序獲取行。不能以相反的順序獲取行。此外,不能跳過行或跳轉到結果集中的特定行。

敏感:有兩種游標:敏感游標和不敏感游標。敏感游標指向實際數據,不敏感游標使用數據的臨時副本。敏感游標比一個不敏感的游標執行得更快,因為它不需要臨時拷貝數據。但是,對其他連接的數據所做的任何更改都將影響由敏感游標使用的數據,因此,如果不更新敏感游標所使用的數據,則更安全。MySQL 游標是敏感的。

我們可以在存儲過程,存儲函數和觸發器中使用 MySQL 游標,咱們先來看下使用 DECLARE 語句聲明的語法:

DECLARE cursor_name CURSOR FOR SELECT_statement;

我們要注意下,游標聲明必須在變量聲明之后。如果在變量聲明之前聲明游標,mysql 將會發出一個錯誤,另外游標必須始終與 SELECT 語句相關聯。完事呢,我們來使用 OPEN 語句打開游標。OPEN 語句初始化游標的結果集,因此我們必須在從結果集中提取行之前調用 OPEN 語句:

OPEN cursor_name;

然后,我們來使用 FETCH 語句來檢索光標指向的下一行,并將光標移動到結果集中的下一行:

FETCH cursor_name INTO variables list;

之后,我們就可以檢查是否有任何行記錄可用,然后再提取它。完事最后還要記得調用 CLOSE 語句來停用光標并釋放與之關聯的內存:

CLOSE cursor_name;

我們要知道,當光標不再使用時,應該關閉它。當我們使用 mysql 游標時,還必須聲明一個 NOT FOUND 處理程序來處理當游標找不到任何行時的情況。因為每次調用 FETCH 語句時,游標會嘗試讀取結果集中的下一行。當光標到達結果集的末尾時,它將無法獲得數據,并且會產生一個條件。NOT FOUND 處理程序用于處理這種情況,我們來看下它的語法結構:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

finished 是一個變量,指示光標到達結果集的結尾。請注意,處理程序聲明必須出現在存儲過程中的變量和游標聲明之后。我們再來看下 mysql 游標的運行原理圖:

如何在 mysql 存儲過程中使用游標

咱們接下來,就要開發一個存儲過程用來獲取 employees 表中所有員工的電子郵件列表。我們先來聲明一些變量,一個用于循環員工電子郵件的游標和一個 NOT FOUND 處理程序:

DECLARE finished INTEGER DEFAULT 0;
DECLARE email varchar(255) DEFAULT  
-- declare cursor for employee email
DEClARE email_cursor CURSOR FOR
 SELECT email FROM employees;
-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET finished = 1;
接下來,使用 OPEN 語句打開 email_cursor:OPEN email_cursor;

然后,迭代電子郵件列表,并使用分隔符 (;) 連接每個電子郵件:

get_email: LOOP
 FETCH email_cursor INTO v_email;
 IF v_finished = 1 THEN
 LEAVE get_email;
 END IF;
 -- build email list
 SET email_list = CONCAT(v_email, ,email_list);
END LOOP get_email;

之后,我們在循環中,使用 v_finished 變量來檢查列表中是否有任何電子郵件來終止循環,完事呢,使用 CLOSE 語句關閉游標:

CLOSE email_cursor;

我們來看下 build_email_list 存儲過程所有代碼:

DELIMITER $$
CREATE PROCEDURE build_email_list (INOUT email_list varchar(4000))
BEGIN
 DECLARE v_finished INTEGER DEFAULT 0;
 DECLARE v_email varchar(100) DEFAULT  
 -- declare cursor for employee email
 DEClARE email_cursor CURSOR FOR
 SELECT email FROM employees;
 -- declare NOT FOUND handler
 DECLARE CONTINUE HANDLER
 FOR NOT FOUND SET v_finished = 1;
 OPEN email_cursor;
 get_email: LOOP
 FETCH email_cursor INTO v_email;
 IF v_finished = 1 THEN
 LEAVE get_email;
 END IF;
 -- build email list
 SET email_list = CONCAT(v_email, ,email_list);
 END LOOP get_email;
 CLOSE email_cursor;
END$$
DELIMITER ;

我們來使用以下腳本測試 build_email_list 存儲過程:

SET @email_list =  
CALL build_email_list(@email_list);
SELECT @email_list;

以上就是如何在 mysql 存儲過程中使用游標,丸趣 TV 小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注丸趣 TV 行業資訊頻道。

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計2606字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 德安县| 宁夏| 福安市| 和平县| 金山区| 胶州市| 正镶白旗| 海林市| 洛隆县| 乐安县| 武平县| 旬阳县| 长葛市| 长岭县| 特克斯县| 灌阳县| 沧源| 新邵县| 曲麻莱县| 庐江县| 湖南省| 平凉市| 绍兴市| 甘孜| 定陶县| 资溪县| 松原市| 买车| 常熟市| 永吉县| 新巴尔虎左旗| 黄骅市| 江城| 隆回县| 临江市| 永川市| 峨眉山市| 福鼎市| 香格里拉县| 汝城县| 开鲁县|