游標——資料的快取區
什麼是游標
游標的使用可以讓使用者想運算元組一樣操作查詢出來的資料集,實際上,它提供了一種從集合性質的結果中提取單挑記錄的手段。
游標(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 修改游標數的限...