oracle cursor(靜態)記錄

遊標定義:
遊標(Cursor)是處理數據的一種方法,爲了查看或者處理結果集中的數據,遊標提供了在結果集中一次一行或者多行前進或向後瀏覽數據的能力。可以把遊標當作一個指針,利用遊標可以返回它當前指向的行記錄(只能返回一行)若要返回多行,則需要不斷的滾動,把想要的數據全部查詢一遍。遊標可以指定結果中的任何位置,然後允許用戶對指定位置的數據進行處理。
遊標的優點:
1)允許程序對由查詢語句select返回的行集合中的每一行執行相同或不同的操作
,而不是對整個行集合執行同一個操作。
2)提供對基於遊標位置的表中的行進行刪除和更新的能力。
遊標的缺點:
在創建遊標時,最需要考慮的事情是,“是否有辦法避免使用遊標?”因爲遊標的效率較差,如果遊標操作的數據超過1萬行,那麼就應該改寫;如果使用了遊標,就要儘量避免在遊標循環中再進行表連接的操作。
靜態遊標分爲:
顯式遊標和隱式遊標
顯示遊標部分:-->
1.遊標的語法:
CURSOR cursor_name (parameter_name datatype) IS select...
2.顯示遊標的使用步驟:
1.聲明遊標 2.打開遊標 3.讀取遊標 4.關閉遊標
3.顯示遊標的四個屬性:
1.Cursorname%found
2.Cursorname%notfound
3.Cursorname%isopen
4.Cursorname%rowcount
4.顯示遊標示例:
示例1:
declare
cursor c is select * from dj_djb where slbh like '201708%';
v_djb dj_djb%rowtype;
begin
open c;
loop
--exit when c%notfound;
if c%isopen then
dbms_output.put_line('遊標已經打開!');
fetch c into v_djb;
exit when c%notfound;
dbms_output.put_line(v_djb.slbh);

dbms_output.enable(buffer_size=>null);
dbms_output.put_line(c%rowcount);
else
  dbms_output.put_line('遊標未打開!');
  end if;
  end loop;

end;
示例2
使用: cursor for loop ......
declare
cursor c is select * from dj_djb where slbh like '201708%';
v_djb dj_djb%rowtype;
begin
for i in c loop
dbms_output.put_line(i.slbh);
dbms_output.put_line(c%rowcount);
end loop;
end;

使用 bulk collect into ....進行批量提取數據

declare
cursor c is select * from dj_djb where slbh like '201708%';
type v_djb_tmp is table of dj_djb%rowtype index by binary_integer;
v_djb v_djb_tmp;
begin
open c;
loop
fetch c bulk collect into v_djb limit 10;
for i in 1..v_djb.count loop
dbms_output.enable(buffer_size=>null);
dbms_output.put_line(v_djb(i).slbh||' 對應的行數:'||i);
end loop;
dbms_output.put_line(c%rowcount);
exit when c%notfound;
end loop;
close c;
end;
隱式遊標部分-->
隱式遊標則由則由系統自動定義,非顯示定義遊標的DML語句即被賦予隱式遊標屬性。其過程由oracle控制,完全自動化。隱式遊標的名稱是SQL,不能對SQL遊標顯式地執行OPEN,FETCH,CLOSE語句。
隱式遊標的屬性:
類似於顯示遊標,隱式遊標同樣具有四種屬性,只不過隱式遊標以SQL%開頭,而顯示遊標以Cursor_name%開頭。通過SQL%總是隻能訪問前一個DML操作或單行SELECT操作的遊標屬性,用於判斷DML執行的狀態和結果,進而控制程序的流程。
SQL%ISOPEN :
遊標是否打開。當執行select into ,insert update,delete時,Oracle會隱含地打開遊標,且在該語句執行完畢或隱含地關閉遊標,因爲是隱式遊標,故SQL%ISOPEN總是false
SQL%FOUND :
判斷SQL語句是否成功執行。當有作用行時則成功執行爲true,否則爲false。SQL%NOTFOUND :
判斷SQL語句是否成功執行。當有作用行時否其值爲false,否則其值爲true。
SQL%ROWCOUNT:
在執行任何DML語句之前,SQL%ROWCOUNT的值都是NULL。

                                                                                              by wolihaito  2018.03.26
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章