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