ORA-01403未找到任何数据select into问题分析
引言:
今天看到的一句很有哲理的話: Dont blame the Car- Learn to be a Good Driver?
1.為什么產生ORA-01403
ORA-01403: 未找到任何數據 異常主要是由于SQL中使用了SELECT INTO 但是根據條件沒有查詢到結果引起.
例如下數據表producten表中不存在名稱為國內共享套餐的產品,此時獲取DI就會得到報錯
DECLAREV_ID NUMBER; BEGINSELECT P.PRODUCTID_PKINTO V_IDFROM PRODUCTEN PWHERE P.PRODUCTNAMESTR = '國內共享套餐';DBMS_OUTPUT.put_line('產品ID=' || V_ID);END;ORA-01403: 未找到任何數據 ORA-06512: 在 line 52. 如何解決ORA-01403
如果只是解決報錯問題,有兩種常見方式
2.1 第一種方式就是提前檢測
DECLAREV_COUNT NUMBER;V_ID NUMBER; BEGIN--先檢查數據存在SELECT COUNT(*)INTO V_COUNTFROM PRODUCTEN PWHERE P.PRODUCTNAMESTR = '國內共享套餐';--然后處理IF V_COUNT > 0 THENSELECT P.PRODUCTID_PKINTO V_IDFROM PRODUCTEN PWHERE P.PRODUCTNAMESTR = '國內共享套餐';END IF;--做其他的事情DBMS_OUTPUT.put_line('產品ID=' || V_ID); END;2.2 第二種方式通過異常處理
beginselect x into v from t where ...<do something> exception when no_data_found then<handle apppropriately> end所以上面的例子可以修改為下面的SQL
DECLAREV_ID NUMBER; BEGINBEGINSELECT P.PRODUCTID_PKINTO V_IDFROM PRODUCTEN PWHERE P.PRODUCTNAMESTR = '國內共享套餐';exceptionwhen no_data_found thenV_ID := NULL;END;DBMS_OUTPUT.put_line('產品ID=' || V_ID); END;--執行結果:PL/SQL procedure successfully completed3. 針對此問題的思考
想想上面的兩種處理方式讓腳本很難看并且很笨拙,用SELECT INTO前先COUNT(*)檢測,感覺浪費性能, 用Exception異常塊來處理,程序腳本中可能就會有很多begin/exception/end塊語句塊看著很傻很笨拙, 很多人提出了為什么Oracle 不能改善ORA-01403,比如當查詢不到數據的時候返回NULL 來替換‘no data found.’異常
? ? ?仔細思考,先使用查詢語句檢查不僅會增加將開銷,由于Oracle的語句讀一致性,如果其他人在count(*)后刪除了該行, 那么再執行select into 也可能得到no_data_found異常;所以使用count(*) 檢查并不安全。
? ? ?而在一個存儲過程中有很多個select語句, 把這些語句又包裝到begin/exception/end塊中會很麻煩,更好的解決方法是
- 編寫更小的程序, 盡可能讓代碼在一個屏幕中
- 通過將查詢鏈接在一起減少查詢語句
?
? ? ?這是我從網上看到的一位國外的程序員對此問題的觀點,原文如下
Absolutely best method is to handle exception what you are trying to avoid. This is safest, fastest, uses least resources and is most readable and uderstandable. If someone will look at your "SELECT min(x) INTO a" he will not puzzle out your intents, he will uderstand code exactly the way it is written. Do not teach your programmers bad things. It is lame what you want to do. Oracle do not need to change anythig about this one. NEVER! This is the way it should be.
And never say "exeption block takes extra lines of code".
It is absolutely dumbest argument I've ever heard.
You should judge programm by the way it woks, not by the count of lines.?
我覺得他說的很有道理
- 最安全最快最省資源的方式就是處理你方法上的異常,同時教別人也這樣做,養成好習慣
- 應該通過程序運行的方式來判斷程序好壞而不是行數
? ?
??
??
前一篇:Oracle 如何MD5加密
總結
以上是生活随笔為你收集整理的ORA-01403未找到任何数据select into问题分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DNC: A deep neural n
- 下一篇: 2011年好莱坞大片索引