天天看點

mysql begin end 用法_MySQL ------ 遊标(CURSOR)(二十六)

MySQL執行檢索操作會傳回一組稱為結果集的行,這組傳回的行都是與SQL 語句相比對的行(零行或多行),但是,使用簡單的select 語句,沒有辦法得到第一行、下一行、或前十行,也不存在一行地處理所有行簡單方法(也就是成批地處理它們),而有時,需要在檢索出來的行中前進或後退一行或多行,怎麼辦來,之前了解的很難實作,那麼本節的遊标就可實作,,

遊标(cursor)

一個存儲在mysql伺服器上資料庫查詢,它不是一條select 語句,而是被語句檢索出來的結果集。 好處:

在存儲了遊标之後,應用程式可以根據需要滾動或浏覽其中的資料。

主要用于:

互動式應用,其中使用者需要滾動螢幕上的資料,并對資料進行浏覽或做出更改。

注意:不像多數DBMS,MySQL遊标隻能用于存儲過程和函數。 版本:MySQL 5 添加了對遊标的支援,要使用的話MySQL版本需要在mysql 5 及以後的版本 one、注意使用遊标的主要步驟:

1、在能夠使用遊标前,必須聲明(定義)它。這個過程實際上沒有檢索資料,他隻是使用select 語句。

2、一旦聲明後,必須打開遊标以供使用。這個過程用前面定義的select 語句把資料實際檢索出來

3、對于填有資料遊标,根據需要取出(檢索)各行。

4、在結束遊标使用時,必須關閉遊标

在聲明遊标後,可根據需要頻繁地打開和關閉遊标。在遊标打開後,可根據需要頻繁地執行取操作。

two、建立遊标

遊标用declare 語句建立。DECLARE 命名遊标,并定義相應地select 語句,根據需要帶where 和其他子句。

下面在存儲過程中使用declare 定義一個遊标,存儲過程完成後遊标也相應消失。

-- declare  遊标名稱 cursor for 查詢語句 
           
mysql begin end 用法_MySQL ------ 遊标(CURSOR)(二十六)

打開和關閉遊标

---  OPEN 遊标名;
           

在處理open 語句時執行查詢,存儲檢索出地資料以供浏覽和滾動遊标處理後,要關閉遊标

---  CLOSE 遊标名; 
           
close會釋放遊标使用的所有内部記憶體和資源,所有遊标使用後都要進行關閉操作

在一個遊标關閉後,如果沒有重新打開,則不能使用它。但是使用聲明過的遊标不需要再次聲明,使用open 語句打開就行。

如果不明确的關閉遊标,mysql 将會在到達end 語句的時候自動關閉它。

上述可以修改為:

mysql
           
mysql begin end 用法_MySQL ------ 遊标(CURSOR)(二十六)

上述的存儲過程聲明、打開和關閉一個遊标,但對檢索出的資料什麼也沒有做

three、使用遊标資料 FETCH

在一個遊标被打開後,可以使用 fetch 語句分别通路它的每一行。

fetch 指定檢索什麼資料(所需的列),檢索出來的資料存儲在什麼地方。還向前移動遊标中的内部指針,使下一條fetch語句檢索下一行(避免重複讀取一行)。
--  從遊标中檢索單個行(第一行)
           
mysql begin end 用法_MySQL ------ 遊标(CURSOR)(二十六)

fetch 檢索目前行的order_num 列(将自動從第一行開始)買到一個名為onum 的局部變量中,對檢索出的資料不做任何處理。

-- 循環檢索資料,從第一行到最後一行
           
mysql begin end 用法_MySQL ------ 遊标(CURSOR)(二十六)

上述使用fetch 檢索目前order_num 到聲明為onum 的變量中,但是 這個fetch 在repeat 内,是以他會反複執行直到done 為真(由nutil done end repeat ;規定)為使它起作用用一個defaut 0 定義變量 done ,那麼done 根據以下代碼設定為真

declare

continue handler

for

sqlstate

'02000' set done=1;

上述,定義了一個

CONTINUE HANDLER(繼續處理程式) ,他是在條件出現時執行的代碼

,這裡是指當SQLSTATE '02000' 出現時,SET done =1.

SQLSTATE '02000' 是一個未找到條件,當REPEAT 由于沒有更多的行供循環而不能繼續時出現 four、注意:

1、declare 語句的釋出存在特定的次序,使用者declare 語句定義的局部變量必須定義任意遊标或句柄之前的定義,而句柄必須在遊标之後定義,不遵守此順序将産生錯誤資訊。

2、如果調用這個存儲過程,他将定義幾個變量和一個continue handler ,定義并打開一個遊标,重複讀取所有的行,然後關閉遊标。如果一切正常可以在循環内放入任意需要的處理(在fetch 語句之後,循環結束之前)

3、除了repeat 語句外,MySQL 還支援循環語句,它可以用來重複執行代碼,直到使用 LEAVE 語句手動退出為止,通常REPEAT 語句的文法使它更适合于對遊标進行循環。