1. 程式人生 > >mysql進階(三)遊標簡易教程

mysql進階(三)遊標簡易教程

mysql遊標簡易教程         從mysql V5.5開始,進行了一次大的改變,就是將InnoDB作為預設的儲存引擎。InnoDB支援事務,而且擁有相關的RDBMS特性:ACID事務支援,資料完整性(支援外來鍵),災難恢復能力等等。

現在簡單總結一下游標的知識。

(一)認識遊標(cursor) 遊標簡單來說就是查詢出來的資料索引,通過對遊標的操作(第一個位置、最後一個位置、上一個位置、下一個位置)可以遍歷出資料。

使用遊標(cursor)的一個主要的原因就是把集合操作轉換成單個記錄處理方式。用SQL語言從資料庫中檢索資料後,結果放在記憶體的一塊區域中,且結果往往是一個含有多個記錄的集合。遊標機制允許使用者在SQL server內逐行地訪問這些記錄,按照使用者自己的意願來顯示和處理這些記錄。

在資料庫中,遊標是一個十分重要的概念。遊標提供了一種對從表中檢索出的資料進行操作的靈活手段,就本質而言,遊標實際上是一種能從包括多條資料記錄的結果集中每次提取一條記錄的機制。遊標總是與一條SQL 選擇語句相關聯,因為遊標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的遊標位置組成。當決定對結果集進行處理時,必須宣告一個指向該結果集的遊標。如果曾經用 C 語言寫過對檔案進行處理的程式,那麼遊標就像您開啟檔案所得到的檔案控制代碼一樣,只要檔案開啟成功,該檔案控制代碼就可代表該檔案。對於遊標而言,其道理是相同的。可見遊標能夠實現按與傳統程式讀取平面檔案類似的方式處理來自基礎表的結果集,從而把表中資料以平面檔案的形式呈現給程式。

我們知道關係資料庫管理系統實質是面向集合的,在MS SQL SERVER 中並沒有一種描述表中單一記錄的表達形式,除非使用where 子句來限制只有一條記錄被選中。因此我們必須藉助於遊標來進行面向單條記錄的資料處理。由此可見,遊標允許應用程式對查詢語句select 返回的行結果集中每一行進行相同或不同的操作,而不是一次對整個結果集進行同一種操作;它還提供對基於遊標位置而對錶中資料進行刪除或更新的能力;而且,正是遊標把作為面向集合的資料庫管理系統和麵向行的程式設計兩者聯絡起來,使兩個資料處理方式能夠進行溝通。 

在資料庫開發過程中,當你檢索的資料只是一條記錄時,你所編寫的事務語句程式碼往往使用SELECT INSERT 語句。但是我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?遊標為我們提供了一種極為優秀的解決方案——那就是使用遊標

就是一個可讀的標識,用來標識資料取到什麼地方了。

(二)遊標特性 1,只讀

2,不滾動

3,不敏感的

(三)使用遊標 需要強調的是,遊標必須在定義處理程式之前被定義,但變數必須在定義遊標之前被定義,順序就是變數定義-遊標定義-處理程式。

1.定義遊標 DECLARE cursor_name CURSOR FOR select_statement

這個語句宣告一個遊標。也可以在子程式中定義多個遊標,一個塊中的每一個遊標必須命名唯一。宣告遊標後也是單條操作的。

2. 遊標OPEN OPEN cursor_name

這個語句開啟先前宣告的遊標。

3. 遊標FETCH

FETCH cursor_name INTO var_name [, var_name] ...

這個語句用指定的開啟遊標讀取下一行(如果有下一行的話),並且前進遊標指標至該行。

4. 遊標CLOSE CLOSE cursor_name

這個語句關閉先前開啟的遊標,注意,用完後必須關閉。

(四)示例 下面是一個儲存過程,裡面用到遊標,逐條更新資料(批量更新資料)

BEGIN

 DECLARE  no_more_record INT DEFAULT 0;

 DECLARE  pID BIGINT(20);

 DECLARE  pValue DECIMAL(15,5);

 DECLARE  cur_record CURSOR FOR   SELECT colA, colB from tableABC;  /*首先這裡對遊標進行定義*/

 DECLARE  CONTINUE HANDLER FOR NOT FOUND  SET  no_more_record = 1; /*這個是個條件處理,針對NOT FOUND的條件,當沒有記錄時賦值為1*/

 OPEN  cur_record; /*接著使用OPEN開啟遊標*/

 FETCH  cur_record INTO pID, pValue; /*把第一行資料寫入變數中,遊標也隨之指向了記錄的第一行*/

 WHILE no_more_record != 1 DO

 INSERT  INTO testTable(ID, Value)

 VALUES  (pID, pValue);

 FETCH  cur_record INTO pID, pValue;

 END WHILE;

 CLOSE  cur_record;  /*用完後記得用CLOSE把資源釋放掉*/

END ---------------------  作者:孫華強  原文:https://blog.csdn.net/sunhuaqiang1/article/details/47026035