Oracle資料庫 八 游標

2021-08-15 17:38:33 字數 3850 閱讀 3616

游標——資料的快取區

什麼是游標

游標的使用可以讓使用者想運算元組一樣操作查詢出來的資料集,實際上,它提供了一種從集合性質的結果中提取單挑記錄的手段。

游標(cursor)形象地看出乙個變動的游標。它實際上是乙個指標,它在一段oracle存放資料查詢結果集的記憶體中,它可以指向結果集中的任意記錄,初始是指向首記錄。想陣列的結構。

游標的種類:

oracle游標分靜態游標和ref游標兩種,其中靜態游標像乙個資料快照,開啟游標後的結構集是對資料庫資料的乙個備份,資料不隨著對錶執行dml操作改變。

靜態游標分成兩種:

顯示游標

--建立語法

cursor cursor_name

[(parameter_name datatype,...)]

is select_statement;

--宣告游標

declare cursor cursor_name

is select_statement

--開啟游標

open cursor_name

--讀取資料

fetch cursor_name into record_name

--關閉游標

close cursor_name

--建立乙個游標並使用它

declare

cursor pdct_cur

is select * from productinfo ;

cur_prodrcd productinfo%rowtype;

begin

open pdct_cur;

fetch pdct_cur into cur_prodrcd;

dbms_output.put_line(cur_prodrcd.productid || '-' || cur_prodrcd.productname || '-' || cur_prodrcd.productprice);

close pdct_cur;

end;

游標中的loop語句

通常顯示游標的資料不止一條,而是多條記錄。這樣就需要乙個遍歷結果集的方式,而loop語句就能實現該功能。

declare

cursor pdct_loop_cur

is select productid,productname,productprice from productinfo where productprice > 2500;

cur_productid prodcuctinfo.productid%type;

cur_productname prodcuctinfo.productname%type;

cur_productprice prodcuctinfo.productprice%type;

begin

open pdct_loop_cur;

loop

fetch proct_loop_cur into cur_productid,cur_productname,cur_productprice;

exit when pdct_loop_cur%notfound;

dbms_output.put_line('產品id:' || cur_productid ||' 產品名稱: ' || cur_productname ||' 產品**:' || cur_productprice);

end loop;

close pdct_loop_cur;

end;

使用bulk collect和for語句的游標

游標中通常使用fetch…into…語句提取資料,這種方式是單條資料提取,而fetch…bulk collect into 語句可以批量提取資料

declare 

cursor pdct_collect_cur

is select * from productinfo;

type pdct_tab is table of productinfo%rowtype;

pdct_rd pdct_tab;

begin

open pdct_collect_cur;

loop

fetch pdct_collect_cur bulk collect into pdct_rd limit 2;

for i in 1..pdct_rd.count loop

dbms_output.put_line('產品id:' || pdct_rd(i).productid || ' 產品名稱:' ||prct_rd(i).productname|| ' 產品**:' || pdct_id(i).productprice);

end loop;

exit when pdct_collect_cur%notfound;

end loop;

close pdct_collect_cur;

end;

使用cursor for loop

游標很多機會都是迭代結果集,我們可以使用更簡單的方式實現,cursor for loop不需要特別的宣告變數,它可以提出行物件型別的資料。

declare

cursor cfl is select productname,productprice from productinfo where productprice > 1200;

begin

for curcfl in cfl

loop

dbms_output.put_line('名稱: ' || curcfl.productname || ' 產品**: ' || curcfl.prodycrprice);

end loop;

end;

顯示游標的屬性

帶引數的游標

使用顯示游標時是可以指定引數的,指定的引數包括引數的順序和引數的型別。引數可以傳遞給游標在查詢中使用,這樣就方便了使用者根據不同的查詢條件進行查詢,也方便了游標在儲存過程中的使用。

declare

cur_productid productinfo.productid%type := '0240';

cur_productprice productinfo.productprice%type := '1200';

cur_prodrcd productinfo%type;

cursor pdct_parameter_cur (id varchar,price number)

is select * from productinfo

where productid like id ||'%'

and productprice > price;

begin

open pdct_parameter_cur(cur_productid,cur_productprice);

loop

fetch pdct_parameter_cur into cur_prodrcd;

exit when pdct_parameter_cur%notfound;

dbms_output.put_line('產品id:' || cur_prodrcd.productid || '產品名稱: ' || cur_prodrcd.productname || ' 產品**:' || cur_prodrcd.productprice);

end loop;

close pdct_parameter_cur;

end;

隱式游標

每當執行select或dml語句時,pl/sql會開啟乙個隱式的游標。隱式游標不受使用者的控制,這一點和顯示游標有明顯的不同。

隱式游標的屬性

資料庫游標(Oracle)

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

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

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