游標(cursor)概念

2021-04-30 01:08:46 字數 3393 閱讀 9405

游標(cursor)

游標是系統為使用者開設的乙個資料緩衝區,存放sql語句的執行結果

每個游標區都有乙個名字

使用者可以用sql語句逐一從游標中獲取記錄,並賦給主變數,交由主語言進一步處理

主語言是面向記錄的,一組主變數一次只能存放一條記錄

僅使用主變數並不能完全滿足sql語句向應用程式輸出資料的要求

嵌入式sql引入了游標的概念,用來協調這兩種不同的處理方式

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

1.游標和游標的優點

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

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

2. 游標種類

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 游標使用在伺服器端,所以被稱為伺服器游標,也被稱為後台游標,而客戶端游標被稱為前台游標。在本章中我們主要講述伺服器(後台)游標

游標詳細說明:

rs.open sql,conn,a,b

引數a為設定游標的型別,其取值為:

0 僅向前游標,只能向前瀏覽記錄,不支援分頁、recordset、bookmark

1 鍵集游標,其他使用者對記錄說做的修改將反映到記錄集中,但其他使用者增加或刪除記錄不會反映到記錄集中。支援分頁、recordset、bookmark

2 動態游標功能最強,但耗資源也最多。使用者對記錄說做的修改,增加或刪除記錄都將反映到記錄集中。支援全功能瀏覽。

3 靜態游標,只是資料的乙個快照,使用者對記錄說做的修改,增加或刪除記錄都不會反映到記錄集中。支援向前或向後移動

引數b為記錄集的鎖定型別,其取值為:

1 鎖定型別,預設的,唯讀,不能作任何修改

2 當編輯時立即鎖定記錄,最安全的方式

3 只有在呼叫update方法時才鎖定記錄集,而在此前的其他操作仍可對當前記錄進行更改、插入和刪除等

4 當編輯時記錄不會被鎖定,而更改、插入和刪除是在批處理方式下完成的

開啟資料記錄集方法其實不止一種,但是我們用的最多的就是

rs.open sql,1,1的方法,可是後面的數字引數很多人不解其意,下面我們來介紹一下。

其實open方法後面有多個引數

cursortype locktype commandtype

比如 rs.open sql,1,1

也可以寫成

rs.cursortype = 1

rs.locktype = 1

rs.open sql

其中cursortype代表從乙個表或者乙個sql查詢結果返回的記錄。

這個引數有四個值分別是:

adopenforwardonly 表示只允許在記錄集內的記錄間往前移動。這個是預設值。

adopenkeyset 反映由其它使用者所做的對記錄的改變或者刪除動作,但並不反映由其它使用者做作的新增新記錄的動作。

adopendynamic 反映由其它使用者所做的對記錄的改變或者刪除動作,包括新增的新記錄

adopenstatic 不反映其它使用者對記錄所做的修改,新增,刪除動作。

這四個值vbscript預定義位

adopenforwardonly = 0

adopenkeyset = 1

adopendynamic = 2

adopenstatic = 3

locktype 表示當開啟記錄集時,資料提供者用於鎖定資料庫的型別:

adlockreadonly 資料不能改變,這是預設值!

adlockpessimistic 資料提供者在開始編輯資料的時候鎖定記錄

adlockoptimistic 僅當呼叫update方法時,資料提供者鎖定記錄

adlockbatchoptimistic 用於批處理修改

他們的常量值定義分別是:

adlockreadonly = 1

adlockpessimistic = 2

adlockoptimistic = 3

adlockbatchoptimistic = 4

rs.open sql,conn,1,1 讀取記錄 select

rs.open sql,conn,1,3 只更新記錄最好 update

rs.open sql,conn,2,3 插入和刪除最好 insert delete

游標屬性cursor

值描述 url需使用的自定義游標的 url。注釋 請在此列表的末端始終定義一種普通的游標,以防沒有由 url 定義的可用游標。default 預設游標 通常是乙個箭頭 auto 預設。瀏覽器設定的游標。crosshair 游標呈現為十字線。pointer 游標呈現為指示鏈結的指標 乙隻手 move ...

Cursor游標(游標)的使用

為了處理sql語句,oracle 將在記憶體中分配乙個區域,這就是上下文區。這個區包含了已經處理完的行數 指向被分析語句的指標,整個區是查詢語句返回的資料行集。游標就是指向上下文區控制代碼或指標。兩種游標 一 顯示游標 需要明確定義!顯示游標被用於處理返回多行資料的select 語句,游標名通過cu...

oracle 游標cursor詳解

一 概念 游標是sql的乙個記憶體工作區,由系統或使用者以變數的形式定義。游標的作用就是用於臨時儲存從資料庫中提取的資料塊。在某些情況下,需要把資料從存放在磁碟的表中調到計算機記憶體中進行處理,最後將處理結果顯示出來或最終寫回資料庫。這樣資料處理的速度才會提高,否則頻繁的磁碟資料交換會降低效率。二 ...