SQL游標的介紹與使用舉例

2022-07-16 05:36:12 字數 2650 閱讀 4381

declare (游標名) [insensitive] [scroll] cursor for select_statement [for ];

(1)當指定insensitive時,系統將建立游標指向的表的臨時副本,後續游標的所有操作將針對該副本(tempdb)進行,也就是說,不會對基表進行修改(事實上使用insensitive游標時不允許進行修改操作),而其他使用者對基表的操作也就不會顯示在之後的提取中。其實從字面上就很好理解啦,insensitive就是不敏感,所以其他使用者的操作不會影響它,若不加insensitive欄位,則預設所有使用者對基表提交的刪除和更新都將反映在後面的提取中。

(2)當指定scroll時,會指定所有的提取選項(first、last、prior、next、relative、absolute)均可用,若未指定scroll,則next是唯一支援的提取選項,如果指定scroll,則不能也指定fast_forward。

(3)select_statement語句用來定義游標結果集,update定義游標中可更新的列(若未宣告,則預設所有列都可更新),如果宣告為read only則此游標為唯讀游標,不能對任何列進行更新。

---判斷成績是否及格

declare @xuehao char(10),@kechenghao char(10)

declare @chenji int

declare cc1 cursor for select sno,cno,grade from sc --定義游標cc1

open cc1 --開啟游標;執行與游標相關聯的查詢語

fetch next from cc1 into @xuehao,@kechenghao,@chenji

--從游標中取得第一記錄內容存入變數

while @@fetch_status=0 --判斷獲取是否成功,即記錄是否取得完成 全域性變數用兩個@@

begin

if @chenji<60

print @xuehao+@kechenghao+'不及格'

else

print @xuehao+@kechenghao+'及格'

fetch next from cc1 into @xuehao,@kechenghao,@chenji

endclose cc1

deallocate cc1

提前宣告好變數以便使用游標,當需要使用游標時先開啟游標,然後用fetch語句為變數賦初值,可以使用系統自帶全域性變數fetch_status來判斷最近一次fetch語句游標提取的情況,當fetch_status = 0時,說明提取成功且返回結果不為空,當fetch_status < 0時說明提取失敗, 當fetch_status > 0時說明提取成功但無返回結果。

fetch_status常常用來做游標遍歷**的結束條件。記得在迴圈中再次使用fetch語句讓游標移動並更新變數的值(sql語言不同於c等語言,不能在while條件中兼顧游標下移判斷fetch_status),當迴圈結束,游標使用完畢後使用close語句關閉游標,當不再使用此游標時,使用deallocate語句釋放游標。

declare @xuehao char(10), @kechenghao char(10);

declare @chengji int;

declare cc2 cursor for select sno, cno, degree from score;

open cc2;

fetch next from cc2 into @xuehao, @kechenghao, @chengji;

while @@fetch_status = 0

begin

if @chengji > 80

begin

update score set degree = degree + 10;

print @xuehao +@kechenghao + '成績大於80,再加10分!';

endelse if @chengji > 70

begin

update score set degree = degree + 20;

print @xuehao +@kechenghao + '成績大於70,再加20分!';

endelse if @chengji > 60

begin

update score set degree = degree + 30;

print @xuehao +@kechenghao + '成績大於60,再加30分!';

endelse

begin

update score set degree = degree + 40;

print @xuehao +@kechenghao + '不及格,再加40分!';

endfetch next from cc2 into @xuehao, @kechenghao, @chengji;

endclose cc2;

deallocate cc2;

題目其實和上乙個差不多,只不過增加了if-else語句的配合使用,另外一點收穫是在print語句中不能直接輸出int型變數,只能輸出char型,若想輸出int型,可以使用str()函式轉化為char型輸出,例如 print sno+sname+cno+str(score); 

SQL 游標的使用

我們都知道在關聯式資料庫中,都是面向集合進行查詢的,而游標卻是化整為零,是按行查詢的,舉個例子比如說之前那個壕買了99臺蘋果6,他可以一次性就買了99臺,這正是我們平常使用sql的方式,他也可以分成若干次買,這就是游標的方式,一次只查詢一行。游標分為游標型別和游標變數,對於游標變數來說,游標變數支援...

SQL游標的使用

sql游標的使用 2008 09 29 13 57 一 游標包括兩個部分 1 游標結果集 由定義該游標的select語句返回的行的集合 2 游標位置 指向這個集合中某行的指標 二 游標處理過程 使用declare 語句宣告 使用open語句開啟 使用fecth語句從游標中提取資料 判斷是否為空,為空...

SQL游標的使用

table1結構如下 id int name varchar 50 declare id int declare name varchar 50 declare cursor1 cursor for 定義游標cursor1 select from table1 使用游標的物件 跟據需要填入selec...