游標是sql的乙個記憶體工作區,由系統或使用者以變數的形式定義。游標的作用就是用於臨時儲存從資料庫中提取的資料塊。在某些情況下,需要把資料從存放在磁碟的表中調到計算機記憶體中進行處理,最後將處理結果顯示出來或最終寫回資料庫。這樣資料處理的速度才會提高,否則頻繁的磁碟資料交換會降低效率。
游標的作用就相當於指標,通過游標pl/sql程式可以一次處理查詢結果集中的一行,並可以對該行資料執行特定操作,從而為使用者在處理資料的過程中提供了很大方便。
1、指定結果集中特定行的位置。
2、基於當前的結果集位置檢索一行或連續的幾行。
3、在結果集的當前位置修改行中的資料。
4、可以以程式設計的方式訪問資料庫
游標的效率較差,如果游標操作的資料超過
1萬行,那麼就應該改寫;
如果使用了游標,就要盡量避免在游標迴圈中再進行表連線的操作。
游標分為顯示游標和隱式游標兩種。顯示游標是由使用者宣告和操作的一種游標,通常用於查詢結果集(即由select語句返回的查詢結果);隱式游標是oracle為所有資料操縱語句(包括只返回單行資料的查詢語句)自動宣告和操作的一種游標。在每個使用者會話中,可以同時開啟多個游標,其數量由資料庫初始化引數檔案中的open cursors引數定義。
1、顯式游標
處理資料的步驟包括:宣告游標、開啟游標、讀取游標和關閉游標 4個步驟。其中讀取游標可能是個反覆操作的步驟,因為游標每次只能讀取一行資料,所以對於多條記錄,需要反覆讀取,知道游標讀取不到資料為止。
宣告游標主要包括游標名稱和為游標提供結果集的select語句。因此,在宣告游標時,必須指定游標名稱和游標所使用的select語句,宣告游標的語法格式如下:
cursor 游標名[(引數1 資料型別[,引數2 資料型別...])]
[return re_type]--執行游標操作後的返回值型別
is select語句;
引數是可選部分,所定義的引數可以出現在select語句的where子句中。如果定義了引數,則必須在開啟游標時傳遞相應的實際引數。
select語句是對錶或檢視的查詢語句,甚至也可以是聯合查詢。可以帶where條件、order by或group by等子句,但不能使用into子句。在select語句中可以使用在定義游標之前定義的變數。
在游標宣告完畢之後,必須開啟才能使用,開啟游標的語法格式如下:
open 游標名[(實際引數1[,實際引數2...])];
開啟游標就是執行定義的select語句,執行完畢,查詢結果裝入記憶體,游標停在查詢結果的首部,注意並不是第一行。當開啟乙個游標時,會完成以下幾件事:
檢查聯編變數的取值;根據聯編變數的取值,確定活動集;活動集的指標指向第一行。
當開啟乙個游標之後,就可以讀取游標中的資料了,讀取游標就是逐行將結果集中的資料儲存到變數中。讀取游標使用fetch...into語句,其語法格式如下:
fetch 游標名 into 變數名1[,變數名2...];
或 fetch 游標名 into 記錄變數;
游標開啟後有乙個指標指向資料區,fetch語句一次返回指標所指的一行資料,要返回多行需重複執行,可以使用迴圈語句來實現。控制迴圈可以通過判斷游標的屬性來進行。
下面對這兩種格式進行說明:
第一種格式中的變數名是用來從游標中接收資料的變數,需要事先定義。變數的個數和型別應與select語句中的字段變數的個數和型別一致。
第二種格式一次將一行資料取到記錄變數中,需要使用%rowtype事先定義記錄變數,這種形式使用起來比較方便,不必分別定義和使用多個變數。
定義記錄變數的方法如下:
變數名 表名|游標名%rowtype;
其中的表必須存在,游標名也必須先定義。
當所有的活動集都被檢索後,游標就應該被關閉。程式將被告知對於游標的處理已經結束,與游標相關聯的資源可以被釋放了。這些資源包括用來儲存活動集的儲存空間,以及用來儲存活動集的臨時空間。
關閉游標語法格式如下:
close 游標名;
顯式游標開啟後,必須顯式地關閉。游標一旦關閉,游標占用的資源就被釋放,釋放了占用的記憶體區。如果再從游標提取資料就是非法的,這樣做會產生下面的oracle錯誤,必須重新開啟才能使用。
ora-1001: invalid cursor --非法游標
或ora-1002:fetch out of sequence --超出界限
示例:
declare
cursor cur1 is
select shdh,line_no,order_code,order_line_no,rec_qty,inv_loc,itemcode,id,order_type
from w_receive_erp
where w_receive_erp.order_code is not null
and order_code >'p15072009'
and status=1 ;
begin
for temp1 in cur1
loop
update w_receive_erp set status=3 where id=temp1.id ;
commit;
end loop;
end;
2、隱式游標
在執行乙個sql語句時,oracle 會自動建立乙個隱式游標。這個游標是記憶體中處理該語句的工作區域。隱式游標主要是處理資料操縱語句的執行結果,特殊情況下,也可以處理select語句的查詢結果。由於隱式游標也有屬性,當使用隱式游標的屬性時,需要在屬性前面加上隱式游標的預設名稱——sql。
示例:
begin
update emp set sal=sal*1.02
where job='salesman';
if sql%notfound then
dbms_output.put_line('沒有員工需要上調工資!');
else
dbms_output.put_line('有'||sql%rowcount||'個員工工資上調');
end if;
end;
五、游標的屬性
無論是顯示游標還是隱式游標,都具有%found、%notfound、%rowcount 和 %isopen 4個屬性。通過這4個屬性可以獲知sql語句的執行結果以及該游標的狀態資訊。游標屬性只能在流程控制語句內,而不能用在sql語句中。
%found:布林型屬性,如果sql語句至少影響到一行資料,則該屬性為true,否則為false。
%notfound:布林型屬性,與%found屬性功能相反。
%rowcount :數字型屬性,返回手sql語句影響的行數。
%isopen:布林型屬性,當游標已經開啟時返回true,游標關閉時則為false。
oracle 游標cursor詳解
一 概念 游標是sql的乙個記憶體工作區,由系統或使用者以變數的形式定義。游標的作用就是用於臨時儲存從資料庫中提取的資料塊。在某些情況下,需要把資料從存放在磁碟的表中調到計算機記憶體中進行處理,最後將處理結果顯示出來或最終寫回資料庫。這樣資料處理的速度才會提高,否則頻繁的磁碟資料交換會降低效率。二 ...
oracle 游標操作,cursor
在游標中使用引數 cursor cursor name p state in state type is select statement 沒有引數的寫法是 cursor cursor name is select statement 對於括號裡面的,in 左邊是引數的別名,in 右邊是引數的型別,...
Oracle中Cursor 游標 學習
一 概念 游標是sql的乙個記憶體工作區,由系統或使用者以變數的形式定義。游標的作用就是用於臨時儲存從資料庫中提取的資料塊。在某些情況下,需要把資料從存放在磁碟的表中調到計算機記憶體中進行處理,最後將處理結果顯示出來或最終寫回資料庫。這樣資料處理的速度才會提高,否則頻繁的磁碟資料交換會降低效率。二 ...