oracle中的游標,游標的概念與作用,游標的分類,游標的使用。
一,游標的概念與作用
摘自百度百科:游標(Cursor)是處理數據的一種方法,為了查看或者處理結果集中的數據,游標提供了在結果集中一次一行或者多行前進或向后瀏覽數據的能力。可以把游標當作一個指針,它可以指定結果中的任何位置,然后允許用戶對指定位置的數據進行處理。游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。游標可以被看作是一個查詢結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的游標位置組成的一個臨時文件,提供了在查詢結果集中向前或向后瀏覽數據、處理結果集中數據的能力。有了游標,用戶就可以訪問結果集中任意一行數據,在將游標放置到某行之后,可以在該行或從該位置的行塊上執行操作。
其實就是用於存放查詢出來的多條記錄的一個臨時變量,我們可以從這個變量中取出我們需要的信息字段。
二,游標的分類
游標有兩種類型:顯式游標和隱式游標。
一般我們用到的SELECT...INTO...查詢語句,一次只能從數據庫中提取一行數據,對於這種形式的查詢和DML操作,系統都會使用一個隱式游標。但是如果要提取多行數據,就需要由程序員定義一個顯式游標,並通過與游標有關的語句進行處理。顯式游標對應一個返回結果為多行多列的SELECT語句。 游標一旦打開,數據就從數據庫中傳送到游標變量中,然后應用程序再從游標變量中分解出需要的數據,並進行處理。
簡單的DML操縱語句和單行查詢語句會使用隱式游標,這些語句分別是插入insert語句,更新update語句,刪除delete語句,單行select查詢語句。
當系統使用一個隱式游標時,可以通過隱式游標的屬性來了解操作的狀態和結果,進而控制程序的流程。隱式游標可以使用名字SQL來訪問,但要注意,通過SQL游標名總是只能訪問前一個DML操作或單行SELECT操作的游標屬性。所以通常在剛剛執行完操作之后,立即使用SQL游標名來訪問屬性。
游標的屬性有以下四種
1.SQL%ROWCOUNT 返回值為一個整型數字 代表DML語句成功執行的數據行數
2.SQL%FOUND 布爾型 值為TRUE代表插入、刪除、更新或單行查詢操作成功
3.SQL%NOTFOUND 布爾型 值為true表示插入、刪除、更新或單行查詢操作失敗。
4.SQL%ISOPEN 布爾型 DML執行過程中為真,結束后為假
三,游標的使用
隱式游標的使用主要就是以上的四種屬性的使用,使用它們來進行一些流程控制。
顯示游標的聲明和使用
cursor cursor_name[ 參數1 參數類型,參數2,參數類型...] is select 語句;
游標的使用步驟:
1.聲明一個游標
2.打開游標 open 游標名(參數1,參數2..);
3.使用循環遍歷游標,從游標中取值。fetch 游標名 into 變量名,循環的退出條件是 游標名%notfound;
4.關閉游標 close 游標名;
游標的遍歷(兩種方式)
1.使用loop循環遍歷
例如 :
declare
cursor outemp is select * from emp;
ouem emp%rowtype;//也可以是%type,但是必須和表中的類型一致。
begin
open outemp;
loop
fetch outemp into ouem;
exit when outemp%notfound;//退出條件
dbms_output.put_line(ouem.ename || ' ' ||ouem.sal);
end loop;
close outemp;
end;
2.使用for循環遍歷游標
例如:
declare
cursor outfor is select * from emp;
begin
for vrow in outfor loop
dbms_output.put_line(vrow.ename || ' ' || vrow.sal);
end loop;
end;
使用for循環遍歷游標的好處:1.不用聲明額外的變量,2.不用打開和關閉游標,3.寫法簡單。
系統引用游標
1. 聲明游標 : 游標名 sys_refcursor
2. 打開游標: open 游標名 for select語句;
3. 從游標中取數據
4. 關閉游標
例如:--輸出員工表中所有的員工姓名和工資
declare
vrows sys_refcursor;
vrow emp%rowtype;
begin
open vrows for select * from emp;
loop
fetch vrows into vrow;
exit when vrows%notfound;
dbms_output.put_line('姓名:'||vrow.ename ||' 工資: ' || vrow.sal);
end loop;
close vrows;
end;
以上就是游標的基礎,使用游標時一定要記得關閉游標,還有就是在定義變量時需要注意定義的類型必須要和表中的字段類型一致,否則會出錯。
詳情參見:https://blog.csdn.net/liyong199012/article/details/8948952