Session Cursor的種類和用法

2021-08-28 06:23:58 字數 2930 閱讀 5640

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...

種蘿蔔 種寂寞

歲末年初,農場遊戲突然在公司火了起來。我有乙個同事,本來是不太會電腦的,也忽然迷上了這個東西,基本上每天要打一次 催促我農場的蘿蔔該收了,趕緊種上新的好讓他去偷。還有乙個部門,本來是不能上網的,因為乙個特殊的機會被開放了,接下來情況就好玩兒了,每次經過那裡都會發現有人在農場忙著拾掇那點菜呢。最終的結...