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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle--plsql异常处理

發(fā)布時(shí)間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle--plsql异常处理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?什么是異常?
Oracle中出現(xiàn)錯(cuò)誤的情形通常分為編譯時(shí)錯(cuò)誤(compile-timeerror)和運(yùn)行時(shí)錯(cuò)誤(run-time error),異常是在PL/SQL執(zhí)行過程中出現(xiàn)的警告或錯(cuò)誤。
?異常是如何觸發(fā)的? 發(fā)生了一個(gè) Oracle 錯(cuò)誤時(shí) 使用RAISE語句顯式觸發(fā)
?如何處理異常? 用處理機(jī)截獲 在調(diào)用環(huán)境中傳播異常

兩種觸發(fā)異常方法:

發(fā)生了 Oracle 錯(cuò)誤,就會(huì)自動(dòng)觸發(fā)相關(guān)的異常。

可以在塊中使用RAISE語句顯式的觸發(fā)異常。被觸發(fā)的異常可以是預(yù)定義的異常,也可以是自定義的異常。




截獲異常

如果在塊的執(zhí)行部分異常被觸發(fā),當(dāng)前的塊就會(huì)轉(zhuǎn)去執(zhí)行異常處理部分的相應(yīng)異常處理機(jī)。如果PL/SQL成功處理了異常,就不會(huì)把異常傳播給外部塊或環(huán)境,從而,PL/SQL塊正常結(jié)束。

異常的傳播

如果在塊的執(zhí)行部分異常被觸發(fā), 然而沒有相應(yīng)的異常處理機(jī),塊就會(huì)異常終止,而將異常傳遞給調(diào)用環(huán)境。

錯(cuò)誤引發(fā)異常,每當(dāng)引發(fā)異常時(shí),都將控制權(quán)傳遞給異常處理程序,異常處理程序處理異常.


捕獲異常:

EXCEPTION WHEN exception1 [OR exception2 . . .] THEN statement1; statement2; . . . [WHEN exception3 [OR exception4 . . .] THEN statement1; statement2; . . .] [WHEN OTHERS THEN statement1; statement2; . . .]


?在異常部分WHEN 子句沒有數(shù)量限制 ?WHEN OTHERS 是最后一個(gè)子句 ?異常處理部分從關(guān)鍵字EXCEPTION開始 ?當(dāng)異常拋出后,控制無條件轉(zhuǎn)到異常處理部分 ?在離開塊之前只能執(zhí)行一種異常處理
預(yù)定義異常:

預(yù)定義異常是由 Oracle 為常見錯(cuò)誤預(yù)先定義的,不需要顯式聲明。

在相應(yīng)的異常處理例程中引用錯(cuò)誤的標(biāo)準(zhǔn)名來截獲一個(gè)Oracle 服務(wù)器預(yù)定義錯(cuò)誤。


例子:

DECLARE v_sal emp.sal%type; BEGIN SELECT sal INTO v_sal FROM emp WHERE empno=999; EXCEPTION WHEN NO_DATA_FOUND then dbms_output.put_line('沒有查到數(shù)據(jù)'); WHEN others then dbms_output.put_line('其它異常'); END;

要截獲Oracle服務(wù)器沒有預(yù)定義的錯(cuò)誤,需先聲明這個(gè)錯(cuò)誤或者使用OTHERS處理機(jī)。?



非預(yù)定義異常:

1.? 在聲明部分聲明異常名。

? ? 語法:

????exception????? EXCEPTION;

? ? 其中:? exception? 異常名

2.? 使用PRAGMAEXCEPTION_INIT語句將異常處理名字和Oracle的錯(cuò)誤代碼關(guān)聯(lián)起來.

? ?語法:

   PRAGMA?? EXCEPTION_INIT ( exception, error_number ) ;

? ? 其中:? exception? 先前聲明的異常名

? ?error_number? 標(biāo)準(zhǔn)Oracle 錯(cuò)誤代碼

3.? 在相應(yīng)的異常處理例程中引用已聲明的異常。


關(guān)鍵字 PRAGMA (偽指令pseudoinstructions)表示語句是一個(gè)編譯指令,在執(zhí)行PL/SQL塊時(shí)并不處理該語句。在PL/SQL塊中,一個(gè)編譯指令EXCEPTION_INIT告訴編譯器將一個(gè)異常處理的名字和一個(gè)Oracle錯(cuò)誤代碼聯(lián)系起來。

DECLARE e_emp_cons EXCEPTION; PRAGMA EXCEPTION_INIT(e_emp_cons,-00001); BEGIN INSERT INTO emp SELECT * FROM emp; EXCEPTION WHEN e_emp_cons THEN dbms_output.put_line('違反唯一性約束'); END;
捕獲異常的函數(shù):

?SQLCODE

? 返回Oracle的錯(cuò)誤代碼

?SQLERRM

? 返回和錯(cuò)誤值相關(guān)聯(lián)的信息

SQLCODE值? 說明

? 0? ??? 沒有異常? ?

? 100? ? ? NO_DATA_FOUND異常

? 負(fù)數(shù)? ? ? 其它Oracle錯(cuò)誤號(hào)


自定義異常:

在PL/SQL塊的聲明部分聲明。

使用RAISE語句顯式地發(fā)布 。


異常的傳遞;

當(dāng)子塊自己處理異常時(shí),它可以正常終止,并且在子塊的END語句之后可以立即將控制交給外部塊。

然而,如果 PL/SQL出現(xiàn)了異常,但當(dāng)前塊中沒有針對(duì)該異常的處理機(jī),就會(huì)尋找外部塊中有沒有處理機(jī),如果所有的外部塊都不能處理這個(gè)異常,則就會(huì)在宿主環(huán)境中出現(xiàn)未經(jīng)處理的異常。

當(dāng)把異常傳播給外部塊,則當(dāng)前塊中的等待執(zhí)行代碼都不再被執(zhí)行。

這種方法的優(yōu)點(diǎn)就是內(nèi)部塊僅處理自己特有的錯(cuò)誤,而將一般的異常處理留給外部塊。

Raise_Application_Error過程
用于創(chuàng)建用戶定義的錯(cuò)誤消息的過程 向用戶返回錯(cuò)誤,并且其返回格式和其它Oracle錯(cuò)誤的格式相同 既可以在可執(zhí)行部分中使用,也可以在異常部分中使用

? Raise_Application_Error(error_number,message);

錯(cuò)誤編號(hào)必須介于 –20000 –20999 之間 錯(cuò)誤消息的長(zhǎng)度可長(zhǎng)達(dá) 2048 個(gè)字節(jié)

利用過程 RAISE_APPLICATION_ERRO返回一個(gè)非標(biāo)準(zhǔn)的錯(cuò)誤代碼和錯(cuò)誤消息,從而可以和預(yù)定義異常進(jìn)行交互。使用RAISE_APPLICATION_ERROR就可以向應(yīng)用程序報(bào)告錯(cuò)誤消息,并且避免了返回沒有處理過的異常。

執(zhí)行區(qū)域: BEGIN … delete from emp where demtno=10; if SQL%NOTFOUND then Raise_Application_Error(-20202, ’this is not a valid department’); end if; … 異常區(qū)域: EXCEPTION when NO_DATA_FOUND then Raise_Application_Error(-20202, ’this is not a valid department’); END;


轉(zhuǎn)載于:https://www.cnblogs.com/android-html5/archive/2012/03/29/2534075.html

總結(jié)

以上是生活随笔為你收集整理的Oracle--plsql异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。