資料庫游標(Oracle)簡析

2021-12-30 02:27:02 字數 3743 閱讀 9735

資料庫游標(oracle)簡析

游標的概念

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

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

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

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

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

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

隱式游標

隱式游標的四個屬性

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

%notfount 與%found相反  www.2cto.com  

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

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

使用隱游標的乙個例子:

[sql] 

set serveroutput on     

begin    

update emp set sal=sal+100 where empno=1234;    

if sql%found then     

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

commit;     

else    

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

end if;     

end;    

顯示游標

顯示游標的四個屬性

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

%notfount 與%found相反  www.2cto.com  

%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)

[sql] 

set serveroutput on    

declare       www.2cto.com  

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)

[sql] 

set serveroutput on    

declare    

cursor emp_cursor is  

select ename,job,sal from emp where empno=7788;    

emp_record emp_cursor%rowtype;    

begin    

open emp_cursor;        

fetch emp_cursor into emp_record;    

dbms_output.put_line(emp_record.ename||','|| emp_record.job||','|| emp_record.sal);      www.2cto.com  

close emp_cursor;    

end;   

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

[sql] 

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)

[sql] 

declare  

cursor books_cursor is  

select title from books where category_id = 1;  

v_one_book  books%rowtype;    www.2cto.com  

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)

游標是sql的乙個記憶體工作區,由系統或使用者以變數形式定義。游標的作用是用於臨時儲存從資料庫中提取的資料塊。為什麼要用游標?資料庫的資料是存放在磁碟中的,游標是把資料從磁碟中調到計算機記憶體中進行處理,最後將處理結果顯示出來或者最終寫回資料庫,這樣可以提高資料處理的效率,因為頻繁的磁碟資料交換會降...

MySQL資料庫瓶頸簡析

查詢與索引優化分析 在優化mysql時,通常需要對資料庫進行分析,常見的分析手段有慢查詢日誌,explain 分析查詢,profiling分析以及show命令查詢系統狀態及系統變數,通過定位分析效能的瓶頸,才能更好的優化資料庫系統的效能。效能瓶頸定位show命令 我們可以通過show命令檢視mysq...

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 ...