oracle資料庫裡的session cursor 又細分為三種型別,分別是 **隱式游標(implicit cursor)、
顯示游標(explicit cursor) 參考游標(ref cursor)**
隱式游標:
隱式游標是oracle中最常見的游標,當我們執行sql 或者plsql時,oracle都會自動幫我們建立隱式游標。之所以稱為隱式游標,是因為它的生命週期: open parse bind exectue fetch
close全部是由sql引擎或者plsql引擎自動完成的。
oracle資料庫的隱式游標有以下四種:
sql%found
sql%notfound
sql%isopen
sql%rowcount
sql%found表示一條sql語句被執行成功後,受其影響而改變的記錄數是否大於等於1. 因此sql%found通常用於執行insert update delete 和select into。
在一條dml語句在執行之前 sql%found的值為null,當這條sql語句執行成功以後,如果改變的記錄條數大於等於1,那麼sql%found的值為true。否則為false。
當使用select into時,當且僅當對應的select 語句的返回結果只有一條記錄時,sql%found的值才是true。當返回的結果為0時,oracle會報錯: no_data_found ,如果select into返回的結果大於1,則oracle會報錯「too_many_rows」.
sql%notfound表示一條sql語句被執行成功之後,受其影響而改變的記錄數是否為0,如果是0,那麼sql%notfound的值為true,否則為false。
sql%open表示隱式游標是否處於開啟狀態。對於隱式游標而言 其值永遠為false。
sql%rowcount表示一條sql語句成功執行後,受其影響而改變的記錄的數量。
當select into語句返回超過一條以上的記錄時,oracle會報錯 too_many_rows,這種情況下sql%rowcount的值1,而不是select into語句所有對應的select返回的記錄數。
顯示游標(explicit cursor)是oracle資料庫中另外一種型別的session cursor,它通常用於plsql**,之所以成為「顯示游標」,是因為其定義和宣告週期管理中的open fetch close均由我們在plsql中控制。
oracle的顯示游標也有四個如下屬性:
(cursorname是我們在plsq**中自定義的顯示游標的名稱)
cursorname%found
cursorname%notfound
cursorname%isopen
cursorname%rowcount
cursorname%found表示指定的游標是否至少有一條記錄被fetch了。
當乙個顯示游標被open以後,如果還一次都沒被fetch,那麼cursorname%found的值就是null,當這個顯示游標被fetch後,cursorname%found的值為true,直到全部fetch完畢。而全部fetch完畢後,如果在執行一次fetch操作,oracle不會報錯,但是cursorname%found的值變成了false。
cursorname%isopen表示指定的顯示游標是否被open了。主要用於異常流中。
cursorname%notfound表示指定的游標是否已經fetch完畢了。
cursorname%notfound在語義上和cursorname%found完全相反。 當乙個顯示游標被open以後,如果還一次都沒用fetch,那麼cursorname%notfound的值是null。當這個顯示游標fetch以後,cursorname%notfound的值為false,知道全部fetch完畢。全部fetch完畢後,如果這個時候再進行fetch,那麼cursorname%notfound的值為true。
cursorname%rowcount表示指定的顯示游標迄今為止一共fetch了多少行記錄。
plsql** 顯示游標的標準用法:
create
or replace procedure
p_demo_explicit_cursor_std
iscursor
clis
select * from
empwhere
rownum
< 12;
emp_rec emp%rowtype;
begin
open c1;
fetch c1 into emp_rec;
while (cl%found) loop
dbms_output.put_line('name='||emp_rec.enmae||',salary='||emp.rec.sal);
fetch cl into emp_rec;
endloop;
close c1;
exception
when others then
--o_parm:='e'||sqlcode||sqlerrm;
rollback;
--寫日誌
return;
end p_demo_explicit_cursor_std;
以下幾點需要注意:
1 顯示游標的標準用法是先open,再fetch,然後用乙個while迴圈處理資料,最後是close。
2 在上述顯示游標的標準用法的while迴圈內部處理晚一條記錄後,一定要記得執行fetch操作以跳到下一條記錄,否則就是死迴圈。
**出自
Session Cursor的種類和用法
oracle資料庫裡的session cursor 又細分為三種型別,分別是 隱式游標 implicit cursor 顯示游標 explicit cursor 參考游標 ref cursor 隱式游標 隱式游標是oracle中最常見的游標,當我們執行sql 或者plsql時,oracle都會自動幫...
8種排序其中的五種
時間久了就忘了,把以前的 拿出來整理一下 插入排序 直接插入排序 straight insertion sort 結構圖 system.out.println 初始值 obj.print a obj.insertsort a system.out.println n排序後 obj.print a p...
種蘿蔔 種寂寞
歲末年初,農場遊戲突然在公司火了起來。我有乙個同事,本來是不太會電腦的,也忽然迷上了這個東西,基本上每天要打一次 催促我農場的蘿蔔該收了,趕緊種上新的好讓他去偷。還有乙個部門,本來是不能上網的,因為乙個特殊的機會被開放了,接下來情況就好玩兒了,每次經過那裡都會發現有人在農場忙著拾掇那點菜呢。最終的結...