資料庫游標(Oracle)

2021-09-30 14:56:29 字數 4019 閱讀 3069

游標是sql的乙個記憶體工作區,由系統或使用者以變數形式定義。

游標的作用是用於臨時儲存從資料庫中提取的資料塊。

為什麼要用游標?資料庫的資料是存放在磁碟中的,游標是把資料從磁碟中調到計算機記憶體中進行處理,最後將處理結果顯示出來或者最終寫回資料庫,這樣可以提高資料處理的效率,因為頻繁的磁碟資料交換會降低效率。

游標有兩種型別:隱式游標顯示游標

隱式游標:對於select...into...語句(一次只能從資料庫中提取一行記錄)和dml(資料操縱語言,也就是insert語句、update語句和delete語句),系統都會採用隱式游標。

顯示游標:對於結果集多於1條記錄的select語句,需要程式設計師自己定義乙個顯示游標。

隱式游標的四個屬性

%fount

值true代表單行查詢語句或dml語句操作成功

%notfount

與%found相反

%isopen

dml執行中為true,執行結束後為false

%rowcount

代表dml語句成功執行的資料行數

使用隱游標的乙個例子:

setserveroutputon

begin

updateempsetsal=sal+100whereempno=1234;

ifsql%foundthen

dbms_output.put_line('成功修改雇員工資!');

commit;

else

dbms_output.put_line('修改雇員工資失敗!');

endif;

end;

顯示游標的四個屬性

%fount

最近的fetch語句返回一行記錄則true,否則為false

%notfount

與%found相反

%isopen

游標開啟時為true,否則為false

%rowcount

獲取fetch語句返回的行數

顯示游標的使用分以下4個步驟:

宣告游標

開啟游標

提取資料

關閉游標

宣告游標

cursor 游標名[(引數1 資料型別[,引數2 資料型別...])] is select語句;

引數是可選部分

開啟游標

open 游標名[(實際引數1[,實際引數2...])];

引數是可選部分,開啟游標時,結果集就被送到的游標工作區

提取資料

fetch 游標名 into 變數名1[,變數名2...];

或 fetch 游標名 into 記錄變數;

游標開啟後有乙個指標指向資料區,fetch語句一次返回指標所指的一行資料,要返回多行需重複執行,可以使用迴圈語句來實現。控制迴圈可以通過判斷游標的屬性來進行。

第一種fetch格式:變數名是用來從游標中接收資料的變數,需要事先定義。變數的個數和型別應與select語句中的字段變數的個數和型別一致。

第二種fetch格式:一次將一行資料提取到記錄變數中,需要使用%rowtype事先定義記錄變數,這種形式使用起來比較方便,不必分別定義和使用多個變數。定義記錄變數的方法:變數名 表名|游標名%rowtype; 其中的表必須存在,游標名也必須先定義。

關閉游標

close 游標名;

顯式游標開啟後,必須顯式地關閉。游標一旦關閉,游標占用的資源就被釋放,游標變成無效,必須重新開啟才能使用。

下面是幾個關於怎麼使用顯示游標的例子:

【例子1】用游標提取emp表中7788雇員的名稱和職務(第一種fetch)

set serveroutput on  

declare

v_ename varchar2(10);

v_job varchar2(10);

cursor emp_cursor is

select ename,job from emp where empno=7788;

begin

open emp_cursor;

fetch emp_cursor into v_ename,v_job;

dbms_output.put_line(v_ename||','||v_job);

close emp_cursor;

end;

【例子2】用游標提取emp表中7788雇員的姓名、職務和工資(第二種fetch)
setserveroutputon

declare

cursoremp_cursoris

selectename,job,salfromempwhereempno=7788;

emp_recordemp_cursor%rowtype;

begin

openemp_cursor;

fetchemp_cursorintoemp_record;

dbms_output.put_line(emp_record.ename||','||emp_record.job||','||emp_record.sal);

closeemp_cursor;

end;

【例子3】用游標提取種類是1的所有書的標題(loop)

declare

cursor books_cursor is

select title from books where category_id = 1;

v_title books.title%type;

v_one_book books%rowtype;

begin

open books_cursor;

loop

fetch books_cursor into v_title;

exit when books_cursor%notfound;

dbms_output.put_line(books_cursor%rowcount || '. ' || v_title);

end loop;

close books_cursor;

end;

【例子4】用游標提取種類是1的所有書的標題(for)

declare

cursor books_cursor is

select title from books where category_id = 1;

v_one_book books%rowtype;

v_count number(2) := 0;

begin

for v_one_book in books_cursor loop

v_count := v_count + 1;

dbms_output.put_line(v_count || '. ' || v_one_book.title);

end loop;

end;

Oracle資料庫之游標

一 準備表和資料 1 建立表 create table emp empno varchar2 32 ename varchar2 32 job varchar2 32 sal varchar2 32 2 新增資料 insert into emp empno,ename,job,sal values ...

Oracle資料庫 八 游標

游標 資料的快取區 什麼是游標 游標的使用可以讓使用者想運算元組一樣操作查詢出來的資料集,實際上,它提供了一種從集合性質的結果中提取單挑記錄的手段。游標 cursor 形象地看出乙個變動的游標。它實際上是乙個指標,它在一段oracle存放資料查詢結果集的記憶體中,它可以指向結果集中的任意記錄,初始是...

Oracle資料庫(四) 游標

游標的屬性和限制 1 游標的屬性 found notfound isopen 判斷游標是否開啟 rowcount 受影響的行數 2 游標的限制 預設的情況下,oracle資料庫只允許在同乙個會話中,開啟300個游標 開啟sql plus 輸入show parameter cursor 修改游標數的限...