ORACLE 游標 cursor的基本用法

2021-08-20 03:51:24 字數 3441 閱讀 4850

游標是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的乙個記憶體工作區,由系統或使用者以變數的形式定義。游標的作用就是用於臨時儲存從資料庫中提取的資料塊。在某些情況下,需要把資料從存放在磁碟的表中調到計算機記憶體中進行處理,最後將處理結果顯示出來或最終寫回資料庫。這樣資料處理的速度才會提高,否則頻繁的磁碟資料交換會降低效率。二 ...