mysql游标进阶_mysql进阶(三)游标简易教程
mysql游標(biāo)簡易教程
從mysql?V5.5開始,進(jìn)行了一次大的改變,就是將InnoDB作為默認(rèn)的存儲引擎。InnoDB支持事務(wù),而且擁有相關(guān)的RDBMS特性:ACID事務(wù)支持,數(shù)據(jù)完整性(支持外鍵),災(zāi)難恢復(fù)能力等等。
現(xiàn)在簡單總結(jié)一下游標(biāo)的知識。
(一)認(rèn)識游標(biāo)(cursor)
游標(biāo)簡單來說就是查詢出來的數(shù)據(jù)索引,通過對游標(biāo)的操作(第一個位置、最后一個位置、上一個位置、下一個位置)可以遍歷出數(shù)據(jù)。
使用游標(biāo)(cursor)的一個主要的原因就是把集合操作轉(zhuǎn)換成單個記錄處理方式。用SQL語言從數(shù)據(jù)庫中檢索數(shù)據(jù)后,結(jié)果放在內(nèi)存的一塊區(qū)域中,且結(jié)果往往是一個含有多個記錄的集合。游標(biāo)機(jī)制允許用戶在SQL?server內(nèi)逐行地訪問這些記錄,按照用戶自己的意愿來顯示和處理這些記錄。
在數(shù)據(jù)庫中,游標(biāo)是一個十分重要的概念。游標(biāo)提供了一種對從表中檢索出的數(shù)據(jù)進(jìn)行操作的靈活手段,就本質(zhì)而言,游標(biāo)實際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。游標(biāo)總是與一條SQL?選擇語句相關(guān)聯(lián),因為游標(biāo)由結(jié)果集(可以是零條、一條或由相關(guān)的選擇語句檢索出的多條記錄)和結(jié)果集中指向特定記錄的游標(biāo)位置組成。當(dāng)決定對結(jié)果集進(jìn)行處理時,必須聲明一個指向該結(jié)果集的游標(biāo)。如果曾經(jīng)用?C?語言寫過對文件進(jìn)行處理的程序,那么游標(biāo)就像您打開文件所得到的文件句柄一樣,只要文件打開成功,該文件句柄就可代表該文件。對于游標(biāo)而言,其道理是相同的。可見游標(biāo)能夠?qū)崿F(xiàn)按與傳統(tǒng)程序讀取平面文件類似的方式處理來自基礎(chǔ)表的結(jié)果集,從而把表中數(shù)據(jù)以平面文件的形式呈現(xiàn)給程序。
我們知道關(guān)系數(shù)據(jù)庫管理系統(tǒng)實質(zhì)是面向集合的,在MS?SQL?SERVER?中并沒有一種描述表中單一記錄的表達(dá)形式,除非使用where?子句來限制只有一條記錄被選中。因此我們必須借助于游標(biāo)來進(jìn)行面向單條記錄的數(shù)據(jù)處理。由此可見,游標(biāo)允許應(yīng)用程序?qū)Σ樵冋Z句select?返回的行結(jié)果集中每一行進(jìn)行相同或不同的操作,而不是一次對整個結(jié)果集進(jìn)行同一種操作;它還提供對基于游標(biāo)位置而對表中數(shù)據(jù)進(jìn)行刪除或更新的能力;而且,正是游標(biāo)把作為面向集合的數(shù)據(jù)庫管理系統(tǒng)和面向行的程序設(shè)計兩者聯(lián)系起來,使兩個數(shù)據(jù)處理方式能夠進(jìn)行溝通。
在數(shù)據(jù)庫開發(fā)過程中,當(dāng)你檢索的數(shù)據(jù)只是一條記錄時,你所編寫的事務(wù)語句代碼往往使用SELECT?INSERT?語句。但是我們常常會遇到這樣情況,即從某一結(jié)果集中逐一地讀取一條記錄。那么如何解決這種問題呢?游標(biāo)為我們提供了一種極為優(yōu)秀的解決方案——那就是使用游標(biāo)
就是一個可讀的標(biāo)識,用來標(biāo)識數(shù)據(jù)取到什么地方了。
(二)游標(biāo)特性
1,只讀
2,不滾動
3,不敏感的
(三)使用游標(biāo)
需要強(qiáng)調(diào)的是,游標(biāo)必須在定義處理程序之前被定義,但變量必須在定義游標(biāo)之前被定義,順序就是變量定義-游標(biāo)定義-處理程序。
1.定義游標(biāo)
DECLARE?cursor_name?CURSOR?FOR?select_statement
這個語句聲明一個游標(biāo)。也可以在子程序中定義多個游標(biāo),一個塊中的每一個游標(biāo)必須命名唯一。聲明游標(biāo)后也是單條操作的。
2.?游標(biāo)OPEN
OPEN?cursor_name
這個語句打開先前聲明的游標(biāo)。
3.?游標(biāo)FETCH
FETCH?cursor_name?INTO?var_name?[,?var_name]?...
這個語句用指定的打開游標(biāo)讀取下一行(如果有下一行的話),并且前進(jìn)游標(biāo)指針至該行。
4.?游標(biāo)CLOSE
CLOSE?cursor_name
這個語句關(guān)閉先前打開的游標(biāo),注意,用完后必須關(guān)閉。
(四)示例
下面是一個存儲過程,里面用到游標(biāo),逐條更新數(shù)據(jù)(批量更新數(shù)據(jù))
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;??/*首先這里對游標(biāo)進(jìn)行定義*/
DECLARE??CONTINUE?HANDLER?FOR?NOT?FOUND??SET??no_more_record?=?1;?/*這個是個條件處理,針對NOT?FOUND的條件,當(dāng)沒有記錄時賦值為1*/
OPEN??cur_record;?/*接著使用OPEN打開游標(biāo)*/
FETCH??cur_record?INTO?pID,?pValue;?/*把第一行數(shù)據(jù)寫入變量中,游標(biāo)也隨之指向了記錄的第一行*/
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
總結(jié)
以上是生活随笔為你收集整理的mysql游标进阶_mysql进阶(三)游标简易教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gdb 版本和gcc版本的对应关系_GN
- 下一篇: mysql 线程池源码模块_易语言My