最近工作中有用到游標,特簡單總結一下:
一、簡介
游標(cursor)是處理資料的一種方法,為了檢視或者處理結果集中的資料,游標提供了在結果集中一次以行或者多行前進或向後瀏覽資料的能力。我們可以把游標當作乙個指標,它可以指定結果中的任何位置,然後允許使用者對指定位置的資料進行處理。(以上選自
)二、使用
1.宣告游標
declare 游標名 cursor select語句(注:此處一定是select語句)
2.開啟游標
open 游標名
3.讀取游標資料
fetch [next | prior | first | last | absolute n | relative n ] from 游標名 into @name1,@name2...
while(@@fetch_status = 0)
begin
--要執行的sql語句
fetch next from 游標名
end開啟游標之後,預設是位於第一行的前面,因此需要fetch next(即第一行),while迴圈是判斷是否有資料,如果有,則執行begin中的語句。注意在執行語句後面新增fetch next..,使游標跳至下一條資料,否則會不停的迴圈執行第一條語句。
其中:next表示返回結果集中當前行的下一行記錄,如果第一次讀取則返回第一行。預設的讀取選項為next
prior表示返回結果集中當前行的前一行記錄,如果第一次讀取則沒有行返回,並且把游標置於第一行之前。
first表示返回結果集中的第一行,並且將其作為當前行。
last表示返回結果集中的最後一行,並且將其作為當前行。
absolute n 如果n為正數,則返回從游標頭開始的第n行,並且返回行變成新的當前行。如果n為負,則返回從游標末尾開始的第n行,並且返回行為新的當前行,如果n為0,則返回當前行。
relative n 如果n為正數,則返回從當前行開始的第n行,如果n為負,則返回從當前行之前的第n行,如果為0,則返回當前行。
4.關閉游標
close 游標名。關閉後不能對游標進行讀取等操作,但可以使用open語句再次開啟
5.釋放游標
deallocate 游標名。即刪除游標,不可再使用
三、注意問題
(1) 儘管使用游標比較靈活,可以實現對資料集中單行資料的直接操作,但游標會在下面幾個方面影響系統的效能:
使用游標會導致頁鎖與表鎖的增加
導致網路通訊量的增加
增加了伺服器處理相應指令的額外開銷
(2) 使用游標時的優化問題:
明確指出游標的用途:for read only或for update
在for update後指定被修改的列
例子(帶事務處理):
begin tran--宣告游標
declare @customerid nchar(5)
declare cuscursor cursor for
select customerid from customers
open cuscursor
fetch next from cuscursor into @customerid
while (@@fetch_status = 0)
begin
--刪除表customercustomerdemo中的記錄
delete from customercustomerdemo where customerid = @customerid
if(@@error != 0)
begin
rollback tran
return
end--刪除表orders中的記錄
delete from orders where customerid = @customerid
if(@@error != 0)
begin
rollback tran
return
endfetch next from cuscursor
endclose cuscursor
deallocate cuscursor
commit tran
Cursor游標(游標)的使用
為了處理sql語句,oracle 將在記憶體中分配乙個區域,這就是上下文區。這個區包含了已經處理完的行數 指向被分析語句的指標,整個區是查詢語句返回的資料行集。游標就是指向上下文區控制代碼或指標。兩種游標 一 顯示游標 需要明確定義!顯示游標被用於處理返回多行資料的select 語句,游標名通過cu...
使用游標 引數游標
參游標是指帶有引數的游標。在定義了引數游標之後,當使用不同引數值多次開啟游標時,可以生成不同的結果集。定義引數游標的語法如下 cursor cursor name parameter name datetype is select statement 注意,當定義引數游標時,游標引數只能指定資料型別...
使用游標 游標FOR迴圈
游標for迴圈是在pl sql塊中使用游標最簡單的方式,它簡化了對游標的處理。當使用游標for迴圈時,oracle會隱含的開啟游標,提取游標資料並關閉游標。例子 顯示emp表所有雇員名及其工資 declare cursor emp cursor isselect ename,sal from emp...