oracle資料庫%notfound的理解
文件中的解釋:
It returns TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO statement returned no rows.Otherwise, it returns FALSE.
這個解釋更加精妙:
%NOTFOUND is the logical opposite of %FOUND. %NOTFOUND yields FALSE if the last fetch returned a row, or TRUE if the last fetch failed to return a row
錯誤的例子:
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
的結果,把b
fetch到變數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
。所以以後為了安全期間可以加上是否為空的判斷
oracle資料庫中sql%notfound的用法詳解
SQL%NOTFOUND
是一個布林值。與最近的sql
語句(update,insert,delete,select
)發生互動,當最近的一條sql
語句沒有涉及任何行的時候,則返回true
。否則返回false
。這樣的語句在實際應用中,是非常有用的。例如要update
一行資料時,如果沒有找到,就可以作相應操作。如:
begin
update table_name set salary = 10000 where emp_id = 10;
if sql%notfound then
insert into table_name (id,name,salary)values("","","") ;
end if;
end;
當update emp_id
為10
的這行記錄,如果update
影響條數為0
,則插入一條資料。
SQL%FOUND
的用法與sql%notfound
用法相反,也是與最近的sql
語句發生互動,如果影響行數大於0
條,則為true
,否則為false
。
SQL%ROWCOUNT
在dml
語句執行前是null
,執行後,對於select into
語句,執行成功則值為1
,不成功則值為0
。
cursor%NOTFOUND
表示這個遊標沒有查到資料–%FOUND – SQL語句影響了一行或多行時為 TRUE
–%NOTFOUND – SQL語句沒有影響任何行時為TRUE
–%ROWCOUNT – SQL語句影響的行數
–%ISOPEN - 遊標是否開啟,始終為FALSE
相關文章
- Oracle資料庫-----資料庫的基本概念Oracle資料庫
- 「Oracle」Oracle 資料庫安裝Oracle資料庫
- oracle資料庫的impdp,expdpOracle資料庫
- 資料庫——對索引的理解資料庫索引
- Oracle資料庫配置Oracle資料庫
- oracle資料庫與oracle例項Oracle資料庫
- 「Oracle」Oracle資料庫基本概念Oracle資料庫
- 「Oracle」Oracle 資料庫基本概念Oracle資料庫
- oracle 備份資料庫,匯出資料庫Oracle資料庫
- oracle rac資料庫的安裝Oracle資料庫
- oracle資料庫的配置檔案Oracle資料庫
- Oracle資料庫中遇到的坑Oracle資料庫
- Oracle 資料庫的眾多 “NAME”Oracle資料庫
- 對資料庫的大體理解資料庫
- 【資料庫資料恢復】如何恢復Oracle資料庫truncate表的資料資料庫資料恢復Oracle
- DataX將MySql資料庫資料同步到Oracle資料庫MySql資料庫Oracle
- 【NUMBER】Oracle資料庫最佳化之理解NUMBER儲存機制Oracle資料庫
- 4.2. Oracle資料庫Oracle資料庫
- Laravel 使用 Oracle 資料庫LaravelOracle資料庫
- oracle資料庫卡頓Oracle資料庫
- Oracle資料庫閃回Oracle資料庫
- 資料庫遷移 :理解資料庫
- oracle資料庫資料字典應用Oracle資料庫
- sqlserver讀取oracle資料庫資料SQLServerOracle資料庫
- 配置ORACLE資料庫到達夢資料庫的異構DBLINKOracle資料庫
- 【資料庫資料恢復】Oracle資料庫誤truncate table的資料恢復案例資料庫資料恢復Oracle
- 【資料庫資料恢復】誤truncate table的Oracle資料庫資料恢復方案資料庫資料恢復Oracle
- Oracle資料庫遷移至PolarDb(阿里雲資料庫)Oracle資料庫阿里
- 【SqlServer】 理解資料庫中的資料頁結構SQLServer資料庫
- 「Oracle」Oracle 資料庫備份還原Oracle資料庫
- [Oracle]Oracle資料庫資料被修改或者刪除恢復資料Oracle資料庫
- DataX將Oracle資料庫資料同步到達夢資料庫Oracle資料庫
- Oracle - 資料庫的組成簡介Oracle資料庫
- 12、Oracle中的其它資料庫物件Oracle資料庫物件
- oracle Mysql PostgreSQL 資料庫的對比OracleMySql資料庫
- Oracle資料庫的查詢變慢了Oracle資料庫
- 刪除linux下的oracle資料庫LinuxOracle資料庫
- ORACLE資料庫的中的db-linkOracle資料庫