您好,登錄后才能下訂單哦!
游標定義:
游標(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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。