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
以上就是?mysql進階(三)游標簡易教程的內容,更多相關內容請關注PHP中文網(www.php.cn)!