游標的原理

2022-07-08 12:03:12 字數 1696 閱讀 9118

一般情況下,sql查詢結果都是多條紀錄的結果集,而高階語言一次只能處理一條紀錄,用游標機制,將多條紀錄一次一條讀取出來處理。從而把對集合的操作轉化為對單個紀錄的處理。游標使用的步驟如下:

1、說明游標。說明游標的時候並不執行select語句。

declare 《游標名》 cursor for

2、開啟游標。開啟游標實際上是執行相應的select語句,把查詢結果讀取到緩衝區中。這時候游標處於活動狀態,指標指向查詢結果集的第一條紀錄。

open 《游標名》;

3、推進游標指標並讀取當前紀錄。用fetch語句把游標指標向前推進一條紀錄,同時將緩衝區中的當前紀錄讀取出來送到變數中。fetch語句通常用在乙個迴圈結構體中,通過迴圈執行fetch語句逐條取出結果集中的行進行處理。現在好多資料庫中,還允許任意方向任意步長易懂游標指標,而不僅僅是把游標指標向前推進一行了。

fetch 《游標名》 into 《變數1>,《變數2>...

4、關閉游標。用close語句關閉游標,釋放結果集占用的緩衝區及其他資源。游標關閉後,就不再和原來的查詢結果集相聯絡。但游標可以再次開啟,與新的查詢結果相聯絡。

close 《游標名》;

//以上出處摘至網路,忘記出處了。。。。。

//在傳統的資料庫概論第四版,儲存過程有一道這樣的題目,自己做完拿出來給大家參考一下

在course表中增加一門課程,若已存在該課程即退出;若不存在即為某個指定系的學生增加選修這門課程,返回選修人數。

/*自定義變數@totalcno,@snotemp,@rec;輸入變數@newcourse,@dept*/

create proc addcourse(@newcourse char(40),@dept char(20))

as declare @totalcno char(4);

declare @snotemp char(5);

declare @rec int;

begin

if exists(select * from course where cname=@newcourse)

return

/*不存在*/

else

select @totalcno=max(cno) from course; /*找出最大課程編號*/

set @totalcno=@totalcno+1;

insert into course values(@totalcno,@newcourse,null,null); /*插入課程*/

declare sx cursor for

select sno from student where sdept=@dept; /*使用游標*/

open sx;

fetch sx into @snotemp; /*推進游標*/

while @@fetch_status=0 /*判斷0 fetch 語句成功。 -1 fetch 語句失敗或此行不在結果集中。 -2 被提取的行不存在。 */

begin

insert into sc values(@snotemp,@totalcno,null);

fetch next from sx into @snotemp;

endclose sx;

select @rec=count(*) from sc where cno=@totalcno; /*返回選課人數*/

print @rec;

end

巢狀游標的原理

fetch status 屬於任何游標的,只要任何乙個游標被提取了,這個提取成功與否的狀態就會儲存到 fetch status中.巢狀游標的原理類似這樣 declare 外層游標 open 外層游標 fetch next 提取外層游標行 while fetch status 0 begin decl...

SQL游標的原理與遍歷

游標的原理 一般情況下,sql查詢結果都是多條紀錄的結果集,而高階語言一次只能處理一條紀錄,用游標機制,將多條紀錄一次一條讀取出來處理。從而把對集合的操作轉化為對單個紀錄的處理。游標使用的步驟如下 1 說明游標。說明游標的時候並不執行select語句。declare 游標名 cursor for 2...

Cursor游標(游標)的使用

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