一般情況下,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...