MYSQL 遊標學習及使用實例


who?(遊標是什麼?)
遊標(cursor)官方定義:是系統爲用戶開通的一個數據緩衝區,存放sql執行結果。每一個遊標區都有一個名字,用戶能夠經過sql語句逐一從遊標中獲取記錄,並賦值給變量,交由主語言進一步處理;
我的理解:感受遊標和指針類似,指定結果集後一行行執行;html

 

why?(爲何要學習遊標)
遊標容許應用程序對查詢語句select 返回的行結果集中每一行進行相同或不一樣的操做,而不是一次對整個結果集進行同一種操做;
它還提供對基於遊標位置而對錶中數據進行刪除或更新的能力;
並且,正是遊標把做爲面向集合的數據庫管理系統和麪向行的程序設計二者聯繫起來,使兩個數據處理方式可以進行溝通。mysql

 

what?(遊標的生命週期)
--1.聲明遊標sql

--2.打開遊標數據庫

--3.聲明遊標提取數據所要存放的變量緩存

--4.定位遊標到哪一行服務器

 

使用實例函數

一、搭配while循環語句使用oop

# 代碼使用目的:update t_shop表中的數據

BEGIN
-- 聲明遊標存儲的變量 DECLARE v_shop_name varchar(255); DECLARE v_shop_area varchar(32); DECLARE done int DEFAULT 0; DECLARE chang_cursor CURSOR for select shop_name,shop_area from t_shop ; -- 遊標中內容爲空時設置爲1 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 打開遊標 OPEN chang_cursor; while done = 0 do -- 將遊標賦值給對應變量 FETCH chang_cursor into v_shop_name,v_shop_area; if v_shop_name = '冰箱旗艦店' THEN update t_shop set shop_area = '廣東深圳' where shop_name = v_shop_name; END IF; end WHILE; -- 關閉遊標 close chang_cursor; END

二、與loop循環語句使用學習

## 代碼目的:統計t_shop表中的數據條數

BEGIN
DECLARE done int DEFAULT 0; DECLARE v_shop_id VARCHAR(32); DECLARE total int DEFAULT 0; DECLARE v_shop_name VARCHAR(255); -- 定義遊標 DECLARE count_rnt CURSOR for select shop_id,shop_name from t_shop; -- 設定not found時done數據變化,FETCH獲取指向的數據行,並把指針指向下一行,如何已是最後一行那就會形成遊標溢出,從而引起mysql預約義的not found錯誤,因此能夠經過設置變量讓溢出時結束 DECLARE CONTINUE HANDLER FOR NOT found set done = 1; -- 打開遊標 open count_rnt; -- 設置循環條件 read_loop:loop FETCH count_rnt into v_shop_id,v_shop_name ; if done = 1 THEN leave read_loop; end IF; SET total = total + 1; end LOOP; -- 關閉遊標 CLOSE count_rnt; -- 輸出結果 select total; END

三、與repeat循環語句使用spa



BEGIN
DECLARE v_shop_id VARCHAR(30); DECLARE v_shop_name varchar(255); DECLARE done int default 0; DECLARE v_total int DEFAULT 0; -- 定義遊標 DECLARE count_rnt1 CURSOR for select shop_id,shop_name from t_shop where shop_name regexp '美的'; -- 定義遊標溢出的 DECLARE CONTINUE HANDLER FOR NOT found set done = 1; -- 打開遊標 open count_rnt1; -- 循環語句 REPEAT FETCH count_rnt1 into v_shop_id,v_shop_name; if done = 0 THEN set v_total = v_total + 1; end if ; UNTIL done = 1 end repeat; -- 關閉遊戲 CLOSE count_rnt1; select v_total; END

 

 

 


備註:相關知識
種類
MS SQL SERVER 支持三種類型的遊標:Transact_SQL 遊標,API服務器遊標和客戶遊標。
(1)Transact_SQL 遊標
  Transact_SQL 遊標是由DECLARE CURSOR 語法定義、主要用在Transact_SQL腳本、存儲過程和觸發器中。Transact_SQL 遊標主要用在服務器上,由從客戶端發送給服務器的Transact_SQL 語句或是批處理、存儲過程、觸發器中的Transact_SQL 進行管理。 Transact_SQL 遊標不支持提取數據塊或多行數據。
(2)API遊標
  API 遊標支持在OLE DB, ODBC 以及DB_library 中使用遊標函數,主要用在服務器上。每一次客戶端應用程序調用API 遊標函數,MS SQL SEVER 的OLE DB 提供者、ODBC驅動器或DB_library 的動態連接庫(DLL) 都會將這些客戶請求傳送給服務器以對API遊標進行處理。
(3)客戶遊標
  客戶遊標主要是當在客戶機上緩存結果集時才使用。在客戶遊標中,有一個缺省的結果集被用來在客戶機上緩存整個結果集。客戶遊標僅支持靜態遊標而非動態遊標。因爲服務器遊標並不支持全部的Transact-SQL語句或批處理,因此客戶遊標經常僅被用做服務器遊標的輔助。由於在通常狀況下,服務器遊標能支持絕大多數的遊標操做。因爲API 遊標和Transact-SQL 遊標使用在服務器端,因此被稱爲服務器遊標,也被稱爲後臺遊標,而客戶端遊標被稱爲前臺遊標。在本章中咱們主要講述服務器(後臺)遊標。

遊標的分類
  根據遊標檢測結果集變化的能力和消耗資源的狀況不一樣,SQL Server支持的API服務器遊標分爲一下4種:

靜態遊標 : 靜態遊標的結果集,在遊標打開的時候創建在TempDB中,不論你在操做遊標的時候,如何操做數據庫,遊標中的數據集都不會變。例如你在遊標打開的時候,對遊標查詢的數據表數據進行增刪改,操做以後,靜態遊標中select的數據依舊顯示的爲沒有操做以前的數據。若是想與操做以後的數據一致,則從新關閉打開遊標便可。
動態遊標 : 這個則與靜態遊標相對,滾動遊標時,動態遊標反應結果集中的全部更改。結果集中的行數據值、順序和成員在每次提取時都會變化。全部用戶作的增刪改語句經過遊標都可見。若是使用API函數或T-SQL Where Current of子句經過遊標進行更新,他們將當即可見。在遊標外部所作的更新直到提交時纔可見。
只進遊標:只進遊標不支持滾動,只支持從頭至尾順序提取數據,數據庫執行增刪改,在提取時是可見的,但因爲該遊標只能進不能向後滾動,因此在行提取後對行作增刪改是不可見的。
鍵集驅動遊標:打開鍵集驅動遊標時,該有表中的各個成員身份和順序是固定的。打開遊標時,結果集這些行數據被一組惟一標識符標識,被標識的列作刪改時,用戶滾動遊標是可見的,若是沒被標識的列增該,則不可見,好比insert一條數據,是不可見的,若可見,須關閉從新打開遊標。 靜態遊標在滾動時檢測不到表數據變化,但消耗的資源相對不多。動態遊標在滾動時能檢測到全部表數據變化,但消耗的資源卻較多。鍵集驅動遊標則處於他們中間,因此根據需求創建適合本身的遊標,避免資源浪費。

參考:https://blog.csdn.net/xiansheng0813/article/details/91322716

http://www.javashuo.com/article/p-skojkruw-dx.html

相關文章
相關標籤/搜索