游標是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)
【例子2】用游標提取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;
【例子3】用游標提取種類是1的所有書的標題(loop)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;
【例子4】用游標提取種類是1的所有書的標題(for)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;
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 修改游標數的限...