select count(*) into 也会报 NO_DATA_FOUND 异常?!
From:?http://www.cnblogs.com/howelei/archive/2006/12/21/599268.html
我們知道NO_DATA_FOUND異常情況僅僅被SELECT..INTO語句觸發,當該WHERE子句沒有找到任何行的時候就會觸發它。
解決的方法通常有兩種:
一種是我們將查詢語句寫成游標,這樣WHERE子句沒有找到任何行的時候, SQL%NOTFOUND就會設置成TRUE,而不會報NO_DATA_FOUND;
還有一種是我們在查詢前先SELECT COUNT(*) INTO 一下,看看WHERE子句是否能找到相應的行,如果有再SELECT..INTO。
第二種方法雖然效率上有消耗,但是簡單易寫,因此我們在寫存儲過程時經常使用。
但是,大家試著測試下面的存儲過程:
??n_num?number;
begin
??select?count(*)
????into?n_num
????from?mascty
???where?mascty.mctcty?=?'123'
???group?by?mascty.mctcty;
end?A_TEST1;
?結果令人吃驚啊,這種偏偏是為了避免產生 NO_DATA_FOUND 異常的SELECT COUNT(*) INTO語句也會產生NO_DATA_FOUND 異常。
原因在哪呢?
從代碼上看SELECT COUNT(*) INTO語句最后跟了group by。編程人員意思可能是將查詢的結果,根據group by的條件分組,然后,再COUNT看一共有多少個組。
其實這種理解是錯誤的。這個查詢真正的順序是先將查詢的結果COUNT,然后再group by。如果查詢的結果COUNT為0,即沒有符合條件的結果,再group by,那么返回的就不是0,而是空(NULL)。
所以將一個空值放到一個整型的變量中就會產生NO_DATA_FOUND的異常。
如何解決呢?
按照編程者真正的目的將存儲過程改為:
?
??n_num?number;
begin
??select?count(*)
????into?n_num
????from?(select?*
????????????from?mascty
???????????where?mascty.mctcty?=?'123'
???????????group?by?mascty.mctcty);
end?A_TEST1;
這樣COUNT出來的值就是0,也是想要的結果,不會產生NO_DATA_FOUND 異常。
總結:
1.一定要注意在使用group by時,SELECT COUNT(*) INTO語句也會產生NO_DATA_FOUND 異常。?
2.一定要理解好group by執行的順序。
總結
以上是生活随笔為你收集整理的select count(*) into 也会报 NO_DATA_FOUND 异常?!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于java社区疫情防控管理系统(jav
- 下一篇: 禁止sethc.exe运行 防止3389