資料庫游標的應用

2021-04-26 03:49:48 字數 3224 閱讀 8497

關聯式資料庫中的操作會對整個行集產生影響。由select語句返回的行集包括所有滿足該語句where子句中條件的行,由語句所返回的完整的行集被稱為結果集。應用程式,特別是互動式聯機應用程式,並不總能將整個結果集作為乙個單元來有效地處理,這些應用程式需要一種機制以便每次處理一行或一部分行,游標就是提供這種機制的結果集擴充套件。

游標通過以下方式擴充套件結果處理:

建立游標的語法如下:

declare cursor_name cursor 

[ local | global ] 

[ forward_only | scroll ] 

[ static | keyset | dynamic | fast_forward ] 

[ read_only | scroll_locks | optimistic ] 

[ type_warning ] 

for select_statement 

[ for update [ of column_name [ ,...n ] ] ]

建立游標語法中各引數的說明如表所示。

表     建立游標語法中的引數列表

引數說明

cursor_name

所定義的transact-sql伺服器游標名稱

local

指定該游標的作用域對在其中建立它的批處理、儲存過程或觸發器是區域性的。該游標名稱僅在這個作用域內有效。在批處理、儲存過程、觸發器或儲存過程output引數中,該游標可由區域性游標變數引用。output引數用於將區域性游標傳遞**用批處理、儲存過程或觸發器,它們可在儲存過程終止後給游標變數指派引數使其引用游標。除非output引數將游標傳遞回來,否則游標將在批處理、儲存過程或觸發器終止時隱性釋放。如果output引數將游標傳遞回來,游標在最後引用它的變數釋放或離開作用域時釋放

global

指定該游標的作用域對連線是全域性的。在由連線執行的任何儲存過程或批處理中,都可以引用該游標名稱。該游標僅在脫接時隱性釋放

forward_only

指定游標只能從第一行滾動到最後一行。fetch next是唯一受支援的提取選項。如果在指定forward_only時不指定static、keyset和dynamic關鍵字,則游標作為dynamic游標進行操作。如果forward_only和scroll均未指定,除非指定static、keyset或dynamic關鍵字,否則預設為forward_only。static、keyset和dynamic游標預設為scroll。與odbc和ado這類資料庫api不同,static、keyset 和dynamic transact-sql游標支援forward_only

static

定義乙個游標,以建立將由該游標使用的資料的臨時複本。對游標的所有請求都從tempdb中的該臨時表中得到應答;因此,在對該游標進行提取操作時返回的資料中不反映對基表所做的修改,並且該游標不允許修改

keyset

指定當游標開啟時,游標中行的成員資格和順序已經固定。對行進行唯一標識的鍵集內建在tempdb內乙個稱為keyset的表中。對基表中的非鍵值所做的更改(由游標所有者更改或由其他使用者提交)在使用者滾動游標時是可視的。其他使用者進行的插入是不可視的(不能通過transact-sql伺服器游標進行插入)。如果某行已刪除,則對該行的提取操作將返回@@fetch_status值-2。從游標外更新鍵值類似於刪除舊行後接著插入新行的操作。含有新值的行不可視,對含有舊值的行的提取操作將返回@@fetch_status值-2。如果通過指定where current of子句用游標完成更新,則新值可視

dynamic

定義乙個游標,以反映在滾動游標時對結果集內的行所做的所有資料更改。行的資料值、順序和成員在每次提取時都會更改。動態游標不支援 absolute提取選項

fast_forward

指定啟用了效能優化的forward_only、read_only游標

read_only

禁止通過該游標進行更新。在update或delete語句的where current of子句中不能引用游標。該選項替代要更新的游標的預設功能

scroll_locks

指定確保通過游標完成的定位更新或定位刪除可以成功。當將行讀入游標以確保它們可用於以後的修改時,microsoft® sql server™會鎖定這些行。如果還指定了fast_forward,則不能指定scroll_locks

optimistic

指定如果行自從被讀入游標以來已得到更新,則通過游標進行的定位更新或定位刪除不成功。當將行讀入游標時sql server不鎖定行。相反,sql server使用timestamp列值的比較,或者如果表沒有timestamp列則使用校驗值,以確定將行讀入游標後是否已修改該行

type_warning

指定如果游標從所請求的型別隱性轉換為另一種型別,則給客戶端傳送警告訊息

示例    建立游標

建立游標,通過游標來完成特定資訊的提取功能,如果people_cursor資料表中存在10條記錄,通過游標可以提取指定一條員工資訊。

程式**如下:

create proc proc_cursornum

@num int

as begin

declare people_cursor scroll cursor for

select * from t_people

order by tb_pid

open  people_cursor

fetch absolute @num from people_cursor

deallocate  people_cursor

end    示例 使用游標

當程式執行的時候,呼叫儲存過程,並通過儲存過程操作游標來完成特定資訊的提取(如獲取工編號為p1006的員工資訊)。

程式**如下:

num_procofcussor方法用於呼叫儲存過程「proc_cursornum」同時傳入所需的資訊編號,將返回結果放入結果集中。

public dataset num_procofcussor(int num)

catch }

單擊【查詢】按鈕,將行號傳給num_procofcussor方法,並獲得指定行的資料資訊。【查詢】按鈕的click事件**如下:

private void button3_click(object sender, eventargs e)

catch (exception ey)

this.datagridview1.datasource = 

cu.num_procofcussor(num).tables[0].defaultview; }

資料庫游標的編寫

1 定義游標 declare 游標名 cur youbiao cursor fast forward for select from 表名 fast forward 最快的游標 2 開啟游標 open 游標名 cur youbiao 2.1 對游標的操作 將每條資料讀取並輸出 2.1.1將游標向後移...

mysql游標場景 資料庫游標的應用場景

我們大部分資料庫在查詢完成後返回給客戶端的基本上都是以乙個游標的方式,游標到底是乙個什麼東西呢,下面是我對它的理解 b開始撥打a的 接通了。a回答 稍等,我去查一查。過了一會兒。a響應了 喂,b,我查到資料了,你還在嗎?b回答道 還在的,那你說一條,我記一條,你先發第一條給我。a 第一條 x b 下...

資料庫中游標的使用

1.為何使用游標 使用游標 cursor 的乙個主要的原因就是把集合操作轉換成單個記錄處理方式。用sql語言從資料庫中檢索資料後,結果放在記憶體的一塊區域中,且結果往往是乙個含有多個記錄的集合。游標機制允許使用者在sql server內逐行地訪問這些記錄,按照使用者自己的意願來顯示和處理這些記錄。2...