資料庫游標(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 ...