複製鏈接
請複製以下鏈接發送給好友

遊標

(處理數據的一種方法)

鎖定
遊標(Cursor)是處理數據的一種方法,為了查看或者處理結果集中的數據,遊標提供了在結果集中一次一行或者多行前進或向後瀏覽數據的能力。
把遊標當作一個指針,它可以指定結果中的任何位置,然後允許用户對指定位置的數據進行處理。
中文名
遊標
外文名
Cursor
步驟1
遊標定義
步驟2
打開遊標
步驟3
提取遊標
步驟4
關閉遊標

遊標定義概念

主語言是面向記錄的,一組主變量一次只能存放一條記錄,僅使用主變量並不能完全滿足SQL語句嚮應用程序輸出數據的要求。即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?遊標為我們提供了一種極為優秀的解決方案。
遊標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。遊標可以被看作是一個查詢結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的遊標位置組成的一個臨時文件,提供了在查詢結果集中向前或向後瀏覽數據、處理結果集中數據的能力。有了遊標,用户就可以訪問結果集中任意一行數據,在將遊標放置到某行之後,可以在該行或從該位置的行塊上執行操作。
當決定對結果集進行處理時,必須聲明一個指向該結果集的遊標。如果曾經用C 語言寫過對文件進行處理的程序,那麼遊標就像您打開文件所得到的文件句柄一樣,只要文件打開成功,該文件句柄就可代表該文件。對於遊標而言,其道理是相同的。可見遊標能夠實現按與傳統程序讀取平面文件類似的方式處理來自基礎表的結果集,從而把表中數據以平面文件的形式呈現給程序。
關係數據庫管理系統實質是面向集合的,在MS SQL SERVER 中並沒有一種描述表中單一記錄的表達形式,除非使用where 子句來限制只有一條記錄被選中。因此我們必須藉助於遊標來進行面向單條記錄的數據處理。由此可見,遊標允許應用程序對查詢語句select 返回的行結果集中每一行進行相同或不同的操作,而不是一次對整個結果集進行同一種操作;它還提供對基於遊標位置而對錶中數據進行刪除或更新的能力;而且,正是遊標把作為面向集合的數據庫管理系統和麪向行的程序設計兩者聯繫起來,使兩個數據處理方式能夠進行溝通。

遊標種類

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

遊標使用遊標

遊標的使用主要分為兩大類。
第一種使用方法:
聲明遊標
遊標在使用之前必須先聲明,可用DECLARE CURSOR語句聲明遊標,其一般格式為:
DECLARE [INSENSITIVE][SCROLL]CURSOR <遊標名>
IS <SELECT-查詢塊>
[FOR{READ ONLY|UPDATE[OF<列名>[,<列名>...]]}]
説明:INSENSITIVE——使用數據的臨時複製來定義遊標,這時的遊標實際上是不允許修改的。
SCROLL——可以使用任何方法來存取數據,允許更新和刪除。
FOR<SELECT-查詢塊>——使用SELECT查詢塊來定義一個遊標。
FOR READ ONLY或FOR UPDATE——説明是隻讀的遊標還是可修改的遊標。
打開遊標
使用OPEN語句的功能打開遊標,實際上就是執行相應的SELECT查詢語句,將查詢結果放到緩衝區。這時遊標處於活動狀態,遊標指針指向第一條記錄。其一般格式為:
OPEN<遊標名>
提取遊標
FETCH語句是從遊標中提取特定的一行。其一般格式為:
FETCH
[[NEXT|PRIOR|FIRST|LAST|ABSOLUTE n|RELATIVE n]FROM]
<遊標名>
[INTO:<主變量1>,<主變量2>...]
説明:NEXT——如果是在OPEN後第一次執行FETCH命令,則返回結果集的第一行,否則使遊標的指針指向結果集的下一行,NEXT是默認的選項。
PRIOR——返回結果集當前行的前一行。
FIRST——返回結果集的第一行。
LAST——返回結果集的最後一行。
遊標 遊標
ABSOLUTE n——如果n是正數,返回結果集的第n行,如果n是負數,則返回結果集的倒數第n行。
RELATIVE n——如果n是正數,返回當前行後的第n行,如果n是負數,則返回當前行開始倒數的第n行。
INTO——該語句的功能是把遊標取出的當前記錄送入到主變量,INTO後的主變量要與在DECLARE CURSOR中SELECT的字段相對應。
關閉遊標
使用CLOSE 語句關閉遊標,其一般格式為:
CLOSE<遊標名>
釋放遊標
使用DEALLOCATE語句釋放遊標,其一般格式為:
DEALLOCATE<遊標名>。
第二種遊標使用方法是使用FOR循環語句,因為FOR循環是對查詢結果的遍歷,無需打開和關閉遊標,也不需要抓取遊標並下移,所以語句更加簡潔。
示例如下:
declare
cursor cur_1 is
select ename from emp;
begin
for i in cur_1 loop
dbms_output.put_line(i.ename);
end loop;
end;