SQL語法之游標

2021-08-01 12:59:50 字數 3999 閱讀 8626

游標是面向行的,它會使開發人員變懶,懶得去想用面向集合的查詢方式實現某些功能。

在效能上,游標會遲更多的記憶體,減少可用的併發,占用頻寬,鎖定資源,當然還有更多的**量。

用乙個比喻來說明為什麼游標會占用更多的資源。當你從atm機取款的時候,是一次取1000的效率更高呢,還是10次100呢?

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 ] ] ]

[;]

1、定義乙個游標

在t-sql中,定義乙個游標可以使非常簡單,也可以相對複雜,這主要取決於游標的引數。而游標的引數設定取決於你對游標原理的了解程度。

游標其實可以理解成乙個定義在特定資料集上的指標,我們可以控制這個指標遍歷資料集,或者僅僅是指向特定的行,所以歐標是定義在以select開始的資料集上的。

游標分為游標型別和游標變數,對於游標變數來說,遵循t-sql變數的定義方法。游標變數支援兩種方式賦值,定義時賦值和先定義後賦值,定義游標變數像定義其他區域性變數一樣,在游標前加」@」,注意,如果定義全域性的游標,只支援定義時直接賦值,並且不能在游標名稱前面加「@」,兩種定義方式如下

--定義後直接複製

declare test_cursor cursor for

select * from person

--先定義後複製

declare @test_cursor2 cursor

set @test_cursor2 = cursor for

select * from person

引數解釋:

1、local和global二選一

--全域性游標,跨global

declare test_cursor cursor global for

select * from person

--區域性游標,跨local

declare test_cursor2 cursor local for

select * from person

--用go結束上面的作用域

goopen test_cursor

open test_cursor2 --此行**報錯,報游標不存在,因此可以理解區域性游標不跨批處理,批處理結束後,將被隱式釋放,無法在其他批處理中呼叫

如果不指定游標作用域,預設作用域為global。

2、forward_only 和 scroll 二選一forward_only意味著游標只能從資料集開始向資料集結束的方向讀取,fetch next是唯一的選項,而scroll支援游標在定義的資料集中向任何方向,或任何位置移動。

--不加引數,預設為forward_only

declare test_cursor cursor for

select * from person

--加forward_only

declare test_cursor2 cursor forward_only for

select * from person

--加scroll

declare test_cursor3 cursor scroll for

select * from person

open test_cursor

open test_cursor2

open test_cursor3

fetch last from test_cursor --報錯 fetch: 提取型別 last 不能與只進游標一起使用。

fetch last from test_cursor2   --報錯 fetch: 提取型別 last 不能與只進游標一起使用。

fetch last from test_cursor3       --正確執行

3、static keyset dynamic 和 fast_forward 四選一這四個關鍵字是游標所在資料集所反映的表資料和游標讀取出資料的關係

4、read_only scroll_locks optimistic 三選一

open test_cursor
游標的使用分為兩部分,一部分是操作游標在資料集內的指向,另一部分是將游標所指向的行的部分或全部內容進行操作。

只有支援6中移動宣杭,分別為第一行(first),最後一行(last),下一行(next),上一行(prior),直接跳到某行(absolute(n)),相對於目前跳幾行(relative(n))。

declare test_cursor cursor scroll for

select name from person

open test_cursor

declare @c nvarchar(10)

--取下一行

fetch next from test_cursor into @c

print @c

--取最後一行

fetch last from test_cursor into @c

print @c

--取第一行

fetch first from test_cursor into @c

print @c

--取上一行

fetch prior from test_cursor into @c

print @c

--取第三行

fetch absolute 3 from test_cursor into @c

print @c

--取相對目前來說上一行

fetch relative -1 from test_cursor into @c

print @c

對於未指定scroll選項的游標來說(未指定是只進游標),只支援next取值。

游標經常會和全域性變數@@fetch_status與while迴圈來共同使用,以達到遍歷游標所在資料集的目的。

例如:

declare test_cursor cursor scroll for

select id,name from person

open test_cursor

declare @id int

declare @name nvarchar(10)

while @@fetch_status = 0

begin

print @id

print @nem

fetch next from test_cursor into @id,@name

endclose test_cursor

deallocate test_cursor

close test_cursor

deallocate test_cursor
到生命週期來談游標。游標是非常**的一種存在,使用游標經常會比使用面向集合的方法慢2-3倍,當游標定義在大資料量時,這個比例還會增加。如果可能,盡量使用while,子查詢,臨時表,函式,表變數等來替代游標,記住,游標永遠只是你最後無奈之下的選擇,而不是首選。

PL SQL語法之游標

本文介紹的是oracle中的游標型別有哪些,以及如何定義和使用各種型別的游標。在oracle中,游標可以分為顯示游標和隱式游標。先說隱式游標,隱式游標沒有語法上的定義,但在使用上卻是使用了游標的特性,所以被稱作隱式游標 顯示游標則又可以分為靜態游標,和動態游標 也稱ref游標 而動態游標又可以進一步...

入門oracle之游標

在寫oracle資料庫函式的時候,往往會返回乙個結果集,我們通過游標來實現這個操作,它的語法是 cursor 游標名 引數名 資料型別 引數名 資料型別 is select 語句 ex cusor a1 is select name from 表名 定義乙個a1的游標返回乙個表的所有name值。使用...

oracle pl sql之游標變數

與游標類似,游標變數也可以處理多行查詢的結果集。但是,游標與游標變數是不同的,就 像常量和變數的關係一樣。游標包括顯式游標和隱式游標,它們都是靜態定義的。當使用者使用它們時,就需要再宣告時定義查詢。而游標變數是動態的,它不與特定 的查詢繫結在一起,而是執行時才確定所使用的查詢。游標變數的定義包括兩個...