亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        ORACLE 異常處理剖析

        2018-06-02 08:50:48林秀麗鄒貴紅盧道設(shè)
        電腦知識與技術(shù) 2018年10期

        林秀麗 鄒貴紅 盧道設(shè)

        摘要:編程領(lǐng)域無論是高手還是新手,程序編寫過程中或業(yè)務(wù)邏輯處理中,遇到難以周全考慮的錯誤是很正常的,所以任何一個優(yōu)秀程序都應(yīng)該帶有對異常的捕獲、提示、處理并恢復(fù)的功能。目的提高程序的健壯性。該文以O(shè)RACLE數(shù)據(jù)庫為例,對異常處理進(jìn)行剖析。

        關(guān)鍵詞:ORACLE數(shù)據(jù)庫;程序健壯性;異常處理

        中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)10-0003-03

        Abstract: Either the master or novice programming, During the preparation process or business logic processing, It is difficult to take into account the error is normal, So any good programs should be with and on the recovery of abnormal, suggesting that capture, processing function,Objective to improve the robustness of the program。In this paper, the ORACLE database as an example, Analysis of exception handling.

        Key words: ORACLE database; the robustness of the program; exception handling

        程序編寫中,錯誤總會遇到不少,錯誤一般分為兩種,一種是輸入錯誤,另一種是邏輯性錯誤[1]。ORACLE將錯誤進(jìn)行了歸納,即:編譯時刻錯誤;運(yùn)行時刻錯誤(也稱異常錯誤)。

        1 異常處理分類

        1.1 編譯時刻錯誤

        編譯錯誤是因用戶錯誤的拼寫關(guān)鍵字、對象名以及錯誤的語法格式等造成,此類錯誤在編譯時PL/SQL引擎會發(fā)并報告給用戶,此時程序是處在運(yùn)行前。

        例1:查詢中數(shù)據(jù)表名輸入錯,編譯時,PL/SQL引擎立馬發(fā)現(xiàn)錯誤并提示。

        1.2 運(yùn)行時刻錯誤(異常錯誤)

        編譯即便通過,錯誤在運(yùn)行時刻還是有可能產(chǎn)生。運(yùn)行時刻錯誤產(chǎn)生的原因有很多,例如:硬件故障、內(nèi)存不足、表的完整性約束被違反、被零除、數(shù)據(jù)在大小長度上的不匹配等[2][3]。

        編譯時刻錯誤在程序內(nèi)部沒必要做特殊處理。對運(yùn)行時刻錯誤,因運(yùn)行環(huán)境的不確定性此錯誤可能會隨時出現(xiàn)。程序員必須在寫程序過程中,對潛在的異常錯誤要盡可能的考慮并做針對性的處理,目的提高程序的健壯性。

        PL/SQL對運(yùn)行時刻錯誤提供了自動捕獲與處理機(jī)制。

        例2:被零除錯誤產(chǎn)生的異常,在PL/SQL引擎編譯可以通過,只在運(yùn)行時刻錯誤才呈現(xiàn)。

        2 異常錯誤處理

        對程序中出現(xiàn)的異常錯誤要進(jìn)行處理,異常處理結(jié)構(gòu)是固定的,如下:

        異常定義區(qū)對預(yù)定義異常是不需要進(jìn)行定義的;異常執(zhí)行是可以顯式引發(fā)異常,也可以由PL/SQL引擎引發(fā)異常;若引發(fā)了異常,則引發(fā)異常的后續(xù)語句將停止執(zhí)行,語句轉(zhuǎn)向異常處理區(qū),直到異常處理完成,再回來。

        異常分為預(yù)定義異常(系統(tǒng)預(yù)定義異常,非預(yù)定義異常)以及用戶定義異常。這兩種異常有不同的定義和引發(fā)方式,但對處理異常錯誤的程序編寫方法與執(zhí)行過程是一樣的。

        無論是哪一類異常,ORACLE在引發(fā)異常時都有一個序號,但程序進(jìn)行異常處理時,不直接使用異常序號,異常的引用與處理必須使用名字。

        2.1 預(yù)定義異常

        預(yù)定義異常分為兩類:第一類是系統(tǒng)預(yù)定義異常,此類異常是系統(tǒng)定義的,提供了異常序號與異常名稱,二十來個,可直接使用,但在異常的捕獲與處理上太有限。第二類是非預(yù)定異常,此類異常系統(tǒng)只提供了異常產(chǎn)生時的序號,并沒有提供異常名,在程序中要捕獲這類異常,用戶就必須自己聲明異常的名稱,用EXCEPTION_INT編譯命令建立異常序號同異常名稱的聯(lián)系,當(dāng)程序發(fā)生異常時,就會自動以該名稱引發(fā)對應(yīng)序號的異常錯誤。

        例3:系統(tǒng)預(yù)定義異常??捎枚鄺l件選擇,在CASE語句的WHEN條件部分,引發(fā)系統(tǒng)預(yù)定義的CASE_NOT_FOUNT異常錯誤,異常處理部分可直接使用異常錯誤名稱對異常錯誤進(jìn)行捕獲。

        例4:非預(yù)定義異常。在插入語句中出現(xiàn)插入異常錯誤,系統(tǒng)提供了異常錯誤序號(ORA-01400),但系統(tǒng)并沒有給此序號以對應(yīng)的名稱,用戶就必須自己聲明名稱(ept_null_error),然后同異常錯誤序號ORA-01400對應(yīng),這樣程序就可以按異常名稱ept_null_error捕獲處理異常。

        預(yù)定義異常還可以通過SQLCODE和SQLERRM內(nèi)置函數(shù)來處理,但此兩函數(shù)在SQL語句中均不能直接使用,需要先將它們賦值給變量后,才能在SQL語句中使用。

        SQLCODE函數(shù)不帶參數(shù),返回的是ORACLE錯誤序號。SQLERRM函數(shù)參數(shù)可寫可不寫,若寫參數(shù)則為錯誤序號,此函數(shù)帶參數(shù)時返回其錯誤序號對應(yīng)的錯誤消息文本,若省去參數(shù)此函數(shù)返回SQLCODE當(dāng)前值對應(yīng)的錯誤消息文本。

        例5:SQLCODE返回的錯誤序號為-2292,SQLERRM返回的是錯誤序號-2292的錯誤消息文本“ORA-02292: 違反完整約束條件 (HR.COUNTR_REG_FK) - 已找到子記錄”。

        2.2 自定義異常

        ORACLE能判斷的異常錯誤且能提供異常錯誤序號的只有預(yù)定義異常,但在實(shí)際使用中遠(yuǎn)遠(yuǎn)不能滿足異常處理的要求。程序員必須自定義一些異常,來滿足具體業(yè)務(wù)規(guī)則以及程序的編程與調(diào)試需求。自定義異常往往不一定是什么錯誤,而是讓程序的結(jié)構(gòu)完美。如:利用異常處理部分對某些問題進(jìn)行集中處理。

        必須先聲明自定義異常,且異常引發(fā)要用RAISE語句顯示拋出,自定義異常沒有異常序號。

        對于自定義異常也可以使用RAISE_APPLICATION_ERROR過程來實(shí)現(xiàn),此函數(shù)對異常的錯誤序號與異常的錯誤消息文本都可自定義,使用靈活方便。此過程很多時候是為應(yīng)用程序編程風(fēng)格提供方便,不一定非要用于異常錯誤的處理。

        例6:建一個使用了RAISE_APPLICATION_ERROR的過程dept_mgr,此過程是判斷一個部門是否有管理員的情況自定義異常錯誤代碼“-20001”,“-20002”與對應(yīng)消息文本“該部門編碼超出了取值范圍”,“該部門沒有管理員”。僅接著調(diào)用dept_mgr過程,按部門編碼與該部門有沒有管理員來捕獲異常錯誤。

        3 異常傳遞

        當(dāng)異常被引發(fā)時,就會立馬跳轉(zhuǎn)到EXCEPTION的異常處理語句中查詢是否有匹配的異常,若在當(dāng)前語句塊或者子語句塊中都沒有匹配的異常,那么此異常就會向當(dāng)前語句塊的外層或子語句塊的調(diào)用方傳遞,直到搜索塊終止還沒有匹配的異常,此時就會向PL/SQL引擎拋出一個未處理的異常。

        以下詳細(xì)剖析異常的傳遞機(jī)制[4][5]。

        3.1 異常傳遞引發(fā)于執(zhí)行部分

        在當(dāng)前塊的執(zhí)行部分引發(fā)異常的處理機(jī)制:若在當(dāng)前塊中有匹配的異常處理,則執(zhí)行該異常處理,然后將控制權(quán)傳到外層語句塊;若在當(dāng)前塊中沒有匹配的異常處理,則異常會被傳到外層的異常處理部分查詢匹配的異常處理;若異常一直被傳遞直到最外層語句塊,都沒查詢到匹配的異常處理,則該程序?qū)惓=Y(jié)束,且在被調(diào)用環(huán)境中顯示錯誤信息。

        如圖2,異常1在當(dāng)前塊中有匹配的異常處理;異常2被傳遞到外層塊中有匹配的異常處理對應(yīng);異常3是沒有查詢到匹配的異常處理的。

        3.2 異常傳遞引發(fā)于聲明部分

        異常傳遞引發(fā)于聲明部分,如變量在初始化是產(chǎn)生異常錯誤,此時異常會立馬向外層塊傳遞,而不被當(dāng)前塊的異常處理部分捕獲。

        如圖3,A 變量定義長度為3,可賦值長度超過了3,結(jié)果引發(fā)異常錯誤,此異常錯誤是向外層塊傳遞的。

        3.3 異常傳遞引發(fā)于異常內(nèi)部

        異常傳遞引發(fā)于異常內(nèi)部,是指異常在處理中也有引發(fā)異常的可能。異常內(nèi)部引發(fā)異常,是會立馬被傳遞到外層語句塊,不論本塊是否能進(jìn)行異常處理。異常內(nèi)部引發(fā)異常,可有RAISE顯式引發(fā),或者因某種錯誤由ORACLE檢測到進(jìn)行隱式引發(fā)。

        如圖4,異常2引發(fā)于異常1內(nèi)部,結(jié)果被傳遞到外層塊處理。

        4 結(jié)論

        本文對PL/SQL中的異常進(jìn)行了剖析,從程序的健壯性闡述了異常的分類,對異常的處理機(jī)制分為兩種,一種是預(yù)定義異常,一種是自定義異常,當(dāng)預(yù)定義異常不能滿足程序需要時,自定義異常可以派上用場。同時詳細(xì)介紹了異常的不同傳遞。以便初學(xué)者深入理解異常處理機(jī)制,開發(fā)人員靈活使用異常機(jī)制解決問題。

        參考文獻(xiàn):

        [1] 李興華,馬云濤. Oracle開發(fā)經(jīng)典[M].北京:清華大學(xué)出版社,2012(16):436-448.

        [2] 龔永罡. Oracle 11g管理與應(yīng)用實(shí)踐教程[M].北京:清華大學(xué)出版社,2014(7).

        [3] 路川,胡欣杰. Oracle 11g寶典[M].北京:電子工業(yè)出版社,2009(4):198-207.

        [4] 谷長勇,吳逸云,單永紅,陳杰. Oracle 11g權(quán)威指南[M]. 2版.北京:電子工業(yè)出版社,2011(18).

        [5] 明昌科技. Oracle從入門到精通[M].北京:清華大學(xué)出版社,2012(14).

        中文精品久久久久中文| 一本久道综合在线无码人妻| 天堂8中文在线最新版在线| 狠狠躁天天躁无码中文字幕图| 国产青青草自拍视频在线播放| 久久99精品国产麻豆| 337p人体粉嫩胞高清视频| 女人被做到高潮免费视频| 91免费国产高清在线| 日韩av一区二区三区精品久久| 疯狂做受xxxx国产| 欧美最猛黑人xxxxx猛交| 99热在线播放精品6| 亚洲国产国语对白在线观看| 乱中年女人伦| vr成人片在线播放网站| 太大太粗太爽免费视频| 国产三级精品三级男人的天堂| 免费观看18禁无遮挡真人网站| 两个人看的www中文在线观看| 亚洲一区二区三区在线中文| 日韩高清不卡一区二区三区| 成人毛片av免费| 久久夜色撩人精品国产小说| 免费观看黄网站| 日本精品一区二区三本中文| 国产av一区二区网站| 精品国产乱码久久久久久郑州公司| 亚洲丁香五月激情综合| 国产高清黄色在线观看91| 亚洲不卡在线免费视频| 天天躁夜夜躁天干天干2020| 精品国内自产拍在线视频| 邻居少妇张开腿让我爽视频| 一本色道久久hezyo无码| 国产精品免费久久久久软件| 中文一区二区三区无码视频| 手机久草视频福利在线观看| 国产激情电影综合在线看| 人妻丰满熟妇AV无码片| av国产自拍在线观看|