欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql存儲(chǔ)過程之游標(biāo)(DECLARE)原理與用法詳解

 更新時(shí)間:2019年12月26日 10:51:04   作者:luyaran  
這篇文章主要介紹了mysql存儲(chǔ)過程之游標(biāo)(DECLARE)原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了mysql存儲(chǔ)過程游標(biāo)(DECLARE)的基本功能、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了mysql存儲(chǔ)過程之游標(biāo)(DECLARE)原理與用法。分享給大家供大家參考,具體如下:

我們?cè)谔幚泶鎯?chǔ)過程中的結(jié)果集時(shí),可以使用游標(biāo),因?yàn)橛螛?biāo)允許我們迭代查詢返回的一組行,并相應(yīng)地處理每行。mysql的游標(biāo)為只讀,不可滾動(dòng)和敏感三種模式,我們來看下:

  • 只讀:無法通過光標(biāo)更新基礎(chǔ)表中的數(shù)據(jù)。
  • 不可滾動(dòng):只能按照select語句確定的順序獲取行。不能以相反的順序獲取行。 此外,不能跳過行或跳轉(zhuǎn)到結(jié)果集中的特定行。
  • 敏感:有兩種游標(biāo):敏感游標(biāo)和不敏感游標(biāo)。敏感游標(biāo)指向?qū)嶋H數(shù)據(jù),不敏感游標(biāo)使用數(shù)據(jù)的臨時(shí)副本。敏感游標(biāo)比一個(gè)不敏感的游標(biāo)執(zhí)行得更快,因?yàn)樗恍枰R時(shí)拷貝數(shù)據(jù)。但是,對(duì)其他連接的數(shù)據(jù)所做的任何更改都將影響由敏感游標(biāo)使用的數(shù)據(jù),因此,如果不更新敏感游標(biāo)所使用的數(shù)據(jù),則更安全。 MySQL游標(biāo)是敏感的。

我們可以在存儲(chǔ)過程,存儲(chǔ)函數(shù)和觸發(fā)器中使用MySQL游標(biāo),咱們先來看下使用DECLARE語句聲明的語法:

DECLARE cursor_name CURSOR FOR SELECT_statement;

我們要注意下,游標(biāo)聲明必須在變量聲明之后。如果在變量聲明之前聲明游標(biāo),mysql將會(huì)發(fā)出一個(gè)錯(cuò)誤,另外游標(biāo)必須始終與SELECT語句相關(guān)聯(lián)。完事呢,我們來使用OPEN語句打開游標(biāo)。OPEN語句初始化游標(biāo)的結(jié)果集,因此我們必須在從結(jié)果集中提取行之前調(diào)用OPEN語句:

OPEN cursor_name;

然后,我們來使用FETCH語句來檢索光標(biāo)指向的下一行,并將光標(biāo)移動(dòng)到結(jié)果集中的下一行:

FETCH cursor_name INTO variables list;

之后,我們就可以檢查是否有任何行記錄可用,然后再提取它。完事最后還要記得調(diào)用CLOSE語句來停用光標(biāo)并釋放與之關(guān)聯(lián)的內(nèi)存:

CLOSE cursor_name;

我們要知道,當(dāng)光標(biāo)不再使用時(shí),應(yīng)該關(guān)閉它。當(dāng)我們使用mysql游標(biāo)時(shí),還必須聲明一個(gè)NOT FOUND處理程序來處理當(dāng)游標(biāo)找不到任何行時(shí)的情況。 因?yàn)槊看握{(diào)用FETCH語句時(shí),游標(biāo)會(huì)嘗試讀取結(jié)果集中的下一行。 當(dāng)光標(biāo)到達(dá)結(jié)果集的末尾時(shí),它將無法獲得數(shù)據(jù),并且會(huì)產(chǎn)生一個(gè)條件。NOT FOUND處理程序用于處理這種情況,我們來看下它的語法結(jié)構(gòu):

DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

finished是一個(gè)變量,指示光標(biāo)到達(dá)結(jié)果集的結(jié)尾。請(qǐng)注意,處理程序聲明必須出現(xiàn)在存儲(chǔ)過程中的變量和游標(biāo)聲明之后。我們?cè)賮砜聪耺ysql游標(biāo)的運(yùn)行原理圖:

咱們接下來,就要開發(fā)一個(gè)存儲(chǔ)過程用來獲取employees表中所有員工的電子郵件列表。我們先來聲明一些變量,一個(gè)用于循環(huán)員工電子郵件的游標(biāo)和一個(gè)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;

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

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;

之后,我們?cè)谘h(huán)中,使用v_finished變量來檢查列表中是否有任何電子郵件來終止循環(huán),完事呢,使用CLOSE語句關(guān)閉游標(biāo):

CLOSE email_cursor;

我們來看下build_email_list存儲(chǔ)過程所有代碼:

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 ;

我們來使用以下腳本測(cè)試build_email_list存儲(chǔ)過程:

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

至于結(jié)果,咱就不贅述了哈。

更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL存儲(chǔ)過程技巧大全》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》及《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總

希望本文所述對(duì)大家MySQL數(shù)據(jù)庫計(jì)有所幫助。

相關(guān)文章

  • mysql創(chuàng)建本地用戶及賦予數(shù)據(jù)庫權(quán)限的方法示例

    mysql創(chuàng)建本地用戶及賦予數(shù)據(jù)庫權(quán)限的方法示例

    這篇文章主要介紹了mysql創(chuàng)建本地用戶及賦予數(shù)據(jù)庫權(quán)限的相關(guān)資料,文中的介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • mysql備份腳本 mysqldump使用方法詳解

    mysql備份腳本 mysqldump使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了mysql備份腳本(mysqldump),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Mysql優(yōu)化神器(推薦)

    Mysql優(yōu)化神器(推薦)

    這篇文章主要介紹了Mysql優(yōu)化神器(推薦),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • MySQL 5.7雙主同步部分表的實(shí)現(xiàn)過程詳解

    MySQL 5.7雙主同步部分表的實(shí)現(xiàn)過程詳解

    這篇文章主要給大家介紹了關(guān)于MySQL 5.7雙主同步部分表實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • SQL NULL值的定義測(cè)試處理空數(shù)據(jù)及SQL?UPDATE語句使用詳解

    SQL NULL值的定義測(cè)試處理空數(shù)據(jù)及SQL?UPDATE語句使用詳解

    這篇文章主要為大家介紹了SQL NULL值的定義測(cè)試處理空數(shù)據(jù)及SQL?UPDATE語句使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • mysql語法之DQL操作詳解

    mysql語法之DQL操作詳解

    大家好,本篇文章主要講的是mysql語法之DQL操作詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 幾個(gè)MySQL高頻面試題的解答

    幾個(gè)MySQL高頻面試題的解答

    這篇文章主要介紹了幾個(gè)MySQL高頻面試題的解答,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2021-01-01
  • MySQL中int(10)和int(11)的區(qū)別詳解

    MySQL中int(10)和int(11)的區(qū)別詳解

    本文主要介紹了MySQL中int(10)和int(11)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 在數(shù)據(jù)庫里將毫秒轉(zhuǎn)換成date格式的方法

    在數(shù)據(jù)庫里將毫秒轉(zhuǎn)換成date格式的方法

    經(jīng)常會(huì)將日期時(shí)間的毫秒數(shù)存放到數(shù)據(jù)庫,但是它對(duì)應(yīng)的時(shí)間看起來就十分不方便,可以使用一些函數(shù)將毫秒轉(zhuǎn)換成date格式
    2014-05-05
  • mysql server 5.7.20 安裝配置方法圖文教程

    mysql server 5.7.20 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql server 5.7.20 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09

最新評(píng)論