oracle 儲存過程遊標的使用
錯誤的例子:
tableA
id name
1 a
2 b
declare
cursor v_cur is select name from tableA;
n varchar2(10);
begin
open v_cur;
loop
exit when v_cur%notfound;
fetch v_cur into n;
dbms_output.put_line(n);
close v_cur;
end loop;
end;
執行上面的語句,結果為:
a
b
b
發現最後一條記錄被列印了兩次。原因是%notfound是判斷最後一次fetch的結果,把bfetch到變數n中之後再執行exit when %notfound判斷得到的是false的記過,也就是說是有返回行的,所以判斷透過,再此執行了列印語句。
發現了另一個疑問:
把a,b都fetch之後按理說遊標已經空了,那麼第三次應該是fetch的空值,為什麼列印出來的還是b呢??
因為fetch..into語句末尾不會修改into變數後面的值。就像select..into如果沒有資料會報異常,但是不會把into後面的變數置為空
再寫一段程式碼
declare
cursor v_cur is select name from tableA where name = 'c';
n varchar2(10);
begin
open v_cur;
loop
exit when v_cur%notfound;
n:='hehe'
fetch v_cur into n;
dbms_output.put_line(n);
close v_cur;
end loop;
end;
執行程式碼的結果:
hehe
疑問:遊標是空遊標,也就是說遊標在開啟的時候就沒有指向任何的值。但為什麼
exit when v_cur%notfound;這條語句還透過了呢??
oracle文件的解釋:
Before the first fetch, %NOTFOUND
returns NULL
. If FETCH
never executes successfully, the loop is never exited, because the EXIT
WHEN
statement executes only if its WHEN
condition is true. To be safe, you might want to use the following EXIT
statement instead:
EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;
也就是說v_cur%notfound有三種狀態,true,false,null。所以以後為了安全期間可以加上是否為空的判斷
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-1790157/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 遊標的使用(儲存過程)MySql儲存過程
- MYsql-儲存過程-遊標的巢狀MySql儲存過程巢狀
- MyBatis 呼叫Oracle儲存過程,傳參、返回遊標的值獲取--示例MyBatisOracle儲存過程
- 儲存過程——遊標儲存過程
- Mysql儲存過程中使用多遊標MySql儲存過程
- Oracle儲存過程Oracle儲存過程
- Oracle儲存過程中定義多個遊標Oracle儲存過程
- 兩種SQL分頁方法儲存過程和遊標儲存過程SQL儲存過程
- 使用儲存過程儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- Oracle儲存過程-1Oracle儲存過程
- oracle的儲存過程Oracle儲存過程
- Oracle儲存過程例子Oracle儲存過程
- Oracle建立儲存過程Oracle儲存過程
- oracle plsql儲存過程OracleSQL儲存過程
- ORACLE 儲存過程示例Oracle儲存過程
- MySQL 儲存過程/遊標/事務MySql儲存過程
- 從sybase的儲存過程轉向oracle的儲存過程儲存過程Oracle
- 儲存過程if,for,while語句,陣列和遊標使用儲存過程While陣列
- 原創:oracle 儲存過程Oracle儲存過程
- oracle 儲存過程批次提交Oracle儲存過程
- oracle 儲存過程學習Oracle儲存過程
- [Flashback]Oracle flashback儲存過程Oracle儲存過程
- Oracle儲存過程學習Oracle儲存過程
- oracle的儲存過程格式Oracle儲存過程
- java 呼叫oracle 儲存過程JavaOracle儲存過程
- oracle--08儲存過程Oracle儲存過程
- Oracle 動態遊標的使用Oracle
- 【實戰】oracle job + 儲存過程 的使用示例Oracle儲存過程
- oracle 儲存過程遊標中處理並記錄異常Oracle儲存過程
- oracle儲存過程詳解--遊標 實現增、刪、改、查Oracle儲存過程
- Mysql 儲存過程的使用MySql儲存過程
- 儲存過程中使用cursor儲存過程
- oracle儲存過程書寫格式Oracle儲存過程
- Oracle Pl/SQL 之 儲存過程OracleSQL儲存過程
- C#呼叫 oracle儲存過程C#Oracle儲存過程
- Oracle儲存過程基本語法Oracle儲存過程
- [Procedure]Oracle之分頁儲存過程Oracle儲存過程