Oracle入门(十四.14)之处理异常
一、什么是異常?
在執(zhí)行破壞程序正常運(yùn)行的程序期間發(fā)現(xiàn)錯(cuò)誤時(shí)會(huì)發(fā)生異常。?
有很多可能的例外原因:用戶在輸入時(shí)出現(xiàn)拼寫錯(cuò)誤; 程序無法正常工作; 廣告網(wǎng)頁不存在; 等等。
你能想到在使用網(wǎng)站或應(yīng)用程序時(shí)遇到的錯(cuò)誤嗎?
二、PL / SQL中的異常
這個(gè)例子工作正常。 但是如果你進(jìn)入“韓國,南方”而不是“韓國”呢?
DECLAREv_country_name wf_countries.country_name%TYPE:= 'Republic of Korea';v_elevation wf_countries.highest_elevation%TYPE; BEGINSELECT highest_elevationINTO v_elevationFROM wf_countriesWHERE country_name = v_country_name;DBMS_OUTPUT.PUT_LINE(v_country_name); END;Republic of Korea
Statement processed.
Exceptions in PL/SQL (continued) Handling Exceptions DECLAREv_country_name wf_countries.country_name%TYPE:='Korea, South';v_elevation wf_countries.highest_elevation%TYPE; BEGINSELECT highest_elevationINTO v_elevationFROM wf_countriesWHERE country_name = v_country_name; END;請(qǐng)注意代碼無法按預(yù)期工作。 沒有找到韓國,南韓的數(shù)據(jù),因?yàn)閲麑?shí)際上是作為韓國存儲(chǔ)的。?
PL / SQL中的這種類型的錯(cuò)誤稱為異常。當(dāng)代碼無法按預(yù)期工作時(shí),PL / SQL會(huì)引發(fā)異常。 發(fā)生異常時(shí),您說異常已被“引發(fā)”。
三、什么是異常處理程序?
????異常處理程序是定義引發(fā)異常(即發(fā)生錯(cuò)誤時(shí))要執(zhí)行的恢復(fù)操作的代碼。????編寫代碼時(shí),程序員需要預(yù)測(cè)執(zhí)行代碼期間可能發(fā)生的錯(cuò)誤類型。 他們需要在代碼中包含異常處理程序來解決這些錯(cuò)誤。 從某種意義上說,異常處理程序允許程序員“防御”他們的代碼。
(1)程序員想要通過使用異常處理程序來解決什么類型的錯(cuò)誤?
?系統(tǒng)錯(cuò)誤(例如,硬盤已滿)
?數(shù)據(jù)錯(cuò)誤(例如,試圖復(fù)制主鍵值)
?用戶操作錯(cuò)誤(例如,數(shù)據(jù)輸入錯(cuò)誤)
?許多其他可能性!
(2)為什么異常處理很重要?
你能想到為什么異常處理很重要的原因嗎?
一些原因包括:
?保護(hù)用戶免受錯(cuò)誤的影響(頻繁的錯(cuò)誤可能會(huì)阻止用戶和/或?qū)е掠脩敉顺鰬?yīng)用程序。)
?保護(hù)數(shù)據(jù)庫免遭錯(cuò)誤(數(shù)據(jù)可能丟失或被覆蓋。)
?重大錯(cuò)誤需要大量系統(tǒng)資源(如果發(fā)生錯(cuò)誤,糾正錯(cuò)誤可能代價(jià)高昂;用戶可能經(jīng)常致電幫助臺(tái)尋求幫助以解決錯(cuò)誤。)
?代碼更具可讀性(錯(cuò)誤處理例程可以寫入發(fā)生錯(cuò)誤的同一個(gè)塊中。)
四、使用PL / SQL處理異常
????塊在PL / SQL引發(fā)異常時(shí)總是終止,但您可以指定異常處理程序在塊結(jié)束之前執(zhí)行最終操作。 異常部分以關(guān)鍵字EXCEPTION開頭。
DECLAREv_country_name wf_countries.country_name%TYPE := 'Korea, South';v_elevation wf_countries.highest_elevation%TYPE; BEGINSELECT highest_elevation INTO v_elevationFROM wf_countries WHERE country_name = v_country_name; EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE ('Country name, '|| v_country_name ||',cannot be found. Re-enter the country name using the correctspelling.'); END;當(dāng)處理異常時(shí),PL / SQL程序不會(huì)突然終止。
當(dāng)引發(fā)異常時(shí),控制轉(zhuǎn)移到異常部分,并執(zhí)行異常部分中的處理程序。 PL / SQL塊終止正常,成功完成。
Country name, Korea, South,
Cannot be found. Re-enter the country name using the correct spelling.
Statement processed.
一次只能發(fā)生一個(gè)例外情況。 發(fā)生異常時(shí),PL / SQL在離開塊之前只處理一個(gè)處理程序。
點(diǎn)A處的代碼不會(huì)執(zhí)行,因?yàn)镾ELECT語句失敗。
以下是另一個(gè)例子。 塊中的select語句檢索Stock Clerks的姓氏。
但是,由于數(shù)據(jù)中存在多個(gè)ST_CLERK,因此會(huì)引發(fā)異常。
以下代碼包含預(yù)定義Oracle服務(wù)器錯(cuò)誤的處理程序,稱為TOO_MANY_ROWS。您將在下一課中了解有關(guān)預(yù)定義服務(wù)器錯(cuò)誤的更多信息。
五、陷阱異常
可以通過在PL / SQL塊的異常處理部分中包含相應(yīng)的處理程序來處理或“陷入”任何錯(cuò)誤。 句法:EXCEPTIONWHEN exception1 [OR exception2 . . .] THENstatement1;statement2;. . .[WHEN exception3 [OR exception4 . . .] THENstatement1;statement2;. . .][WHEN OTHERS THENstatement1;statement2;. . .]
每個(gè)處理程序由一個(gè)WHEN子句組成,該子句指定一個(gè)異常名稱,然后是引發(fā)該異常時(shí)要執(zhí)行的一系列語句。 您可以在EXCEPTION部分包含任意數(shù)量的處理程序來處理特定的異常。 但是,對(duì)于單個(gè)異常,您不能擁有多個(gè)處理程序。
在語法中:
?異常是預(yù)定義異常的標(biāo)準(zhǔn)名稱或在聲明部分中聲明的用戶定義異常的名稱
?語句是一個(gè)或多個(gè)PL / SQL或SQL語句
?OTHERS是一個(gè)可選的異常處理?xiàng)l款,可以捕捉任何未明確處理的異常
六、其他異常處理程序
異常處理部分只捕獲指定的異常; 除非使用OTHERS異常處理程序,否則任何其他異常都不會(huì)被捕獲。OTHERS處理程序捕獲所有尚未被捕獲的異常。 如果使用,OTHERS必須是定義的最后一個(gè)異常處理程序。
考慮下面的例子:
?如果程序引發(fā)異常NO_DATA_FOUND,則會(huì)執(zhí)行相應(yīng)處理程序中的語句。
?如果引發(fā)異常TOO_MANY_ROWS,則執(zhí)行相應(yīng)處理程序中的語句。
?但是,如果發(fā)生其他異常,則會(huì)執(zhí)行OTHERS異常處理程序中的語句。
EXCEPTIONWHEN NO_DATA_FOUND THENstatement1;...WHEN TOO_MANY_ROWS THENstatement2;...WHEN OTHERS THENstatement3;
七、捕獲異常指南
在捕獲異常時(shí)遵循以下準(zhǔn)則:
?每當(dāng)有可能發(fā)生錯(cuò)誤時(shí)總是添加異常處理程序。 在計(jì)算,字符串操作和SQL數(shù)據(jù)庫操作期間,錯(cuò)誤尤其可能。
?盡可能處理命名的異常,而不是在異常處理程序中使用OTHERS。 了解預(yù)定義例外的名稱和原因。
?使用不良數(shù)據(jù)組合來測(cè)試代碼,以查看可能出現(xiàn)的錯(cuò)誤。
?在異常處理程序中寫出調(diào)試信息。
?仔細(xì)考慮每個(gè)異常處理程序是否應(yīng)該提交事務(wù),將其回滾或讓其繼續(xù)。 無論錯(cuò)誤有多嚴(yán)重,您都希望使數(shù)據(jù)庫保持一致狀態(tài)并避免存儲(chǔ)任何不良數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的Oracle入门(十四.14)之处理异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者荣耀超长名字 王者荣耀超长名字大全
- 下一篇: Oracle入门(十四.15)之捕获Or