日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

select count(*) into 也会报 NO_DATA_FOUND 异常?!

發布時間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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。
第二種方法雖然效率上有消耗,但是簡單易寫,因此我們在寫存儲過程時經常使用。

但是,大家試著測試下面的存儲過程:

create?or?replace?procedure?A_TEST1?is
??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的異常。

如何解決呢?
按照編程者真正的目的將存儲過程改為:
?

create?or?replace?procedure?A_TEST1?is
??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 异常?!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。