oracle raise_application_error,RAISE_ APPLICATION_ ERROR--之異常處理

平時用來測試的異常處理

我們都是通過dbms_output.put_line來輸出異常信息,但是在實際的應用中,需要把異常信息返回給調用的客戶端。

其實 RAISE_APPLICATION_ERROR 是將應用程序專有的錯誤從服務器端轉達到客戶端應用程序(其他機器上的SQLPLUS或者其他前臺開發語言)

raise_application_error(異常類型,傳遞信息)

異常類型:number 值域:-20000 到-20999

傳遞信息:varchar2(2000)

DBMS_STANDARD包的RAISE_APPLICATION_ERROR過程,可以重新定義異常錯誤消息,它為應用程序提供了一種與ORACLE交互的方法。語法如下

RAISE_APPLICATION_ERROR(errorNumber,errorString)

errorNumber是數值在-20000到-20999之間,errorString為自定義的錯誤信息。

如:

update jobs set job_title = v_newJobTitle where job_id = v_jobid;

if sql%notfound then

RAISE_APPLICATION_ERROR(-20167,'update failure!');

end if;

..........

當在sqlpus中測試時,一旦沒有要更新的行,則拋出這樣的異常:

ORA-20167: update failure!

oracle的異常分為編譯時異常(錯誤)和運行時異常,前者不能被處理,后者可以被處理。

我們主要討論運行時異常。

異常類型:

a、預定義異常

已命名的預定義異常有CURSOR_ALREADY_OPEN、INVALID_NUMBER、TOO_MANY_ROWS等

b、用戶定義異常

c、已命名異常(已命名異常不能單獨歸為一類異常,但它有點特別,所以我將它單獨羅列說明)

如果希望處理一個異常(被when子串處理),那么異常必須有一個名字,如TOO_MANY_ROWS;

數據庫錯誤有數千個,但是只有不到25個是內建的已命名異常(這些異常都聲明在standard包中);

要處理那些未命名的異常時,你可以將一個名字和一個錯誤號聯系在一起,達到這個目的的語句是pragma exception_init語句;

拋出異常:

a、通過pl/sql運行時引擎

當數據庫或pl/sql在運行時發生錯誤時,一個異常被pl/sql運行時引擎自動拋出

b、使用raise語句

異常也可以通過raise語句拋出:raise exception_name;

c、調用raise_application_error存儲過程

處理異常&異常傳播:

a、一旦程序進入異常部分就不能再回到同一塊的執行部分;當異常被處理后,控制返回到外層執行部分的下一條語句;

b、如果有when others子串,則必須放置在最后面作為缺省處理器處理沒有顯式處理的異常;

c、執行部分拋出的異常將首先傳遞到同一塊的異常部分,如果在同一塊的異常部分沒有處理這個異常的處理器,那么異常將會傳播到上一層的異常部分中,一直到最外層;

d、異常被處理后如果你仍然希望它繼續傳播,可以在異常處理的最后執行不帶參數的raise語句(raise語句將重新拋出出現的異常,允許它繼續傳播);

--這是一個上面部分知識點的示例(偽代碼)說明

declare

...

user_define_exception exception; --用戶定義異常

invalid_column_name exception;

--補充說明:如果我們在程序塊中使用了無效列名,會有括號中的錯誤提示(ORA-00904:invalid column name)

--下面我們將這個異常代碼號與我們自定義的異常進行關聯,即為異常命名

pragma exception_init(invalid_column_name,-904);

begin

...

--raise user_define_exception; --可以顯式引發異常

exception

when TOO_MANY_ROWS then --預定義異常處理

...;

when user_define_exception then --用戶定義異常處理

...;

when invalid_column_name then --PRAGMA EXCEPTION_INIT異常處理

...;

raise; --繼續傳播該異常

end;

sqlcode和sqlerrm:

a、另外一種處理數據庫錯誤的方法是使用內建函數sqlcode和sqlerrm;

b、sqlcode將返回現行數據庫錯誤號,這些錯誤號中除了no_data_found是+100外其他都是負數;

c、sqlerrm返回文本描述的錯誤信息;

d、為了獲得用戶自定義異常返回的sqlerrm和sqlcode,你需要使用raise_application_error函數給自定義異常標注錯誤號

給自定義錯誤標注號碼:

a、raise_application_error內建函數用于拋出一個異常并給異常賦予一個錯誤號以及錯誤信息;

b、自定義異常的缺省錯誤號是+1,缺省信息是user_defined_exception。來自未處理的異常的一般信息對于識別導致錯誤的原因沒有幫助,

c、raise_application_error函數能夠在pl/sql程序塊的執行部分和異常部分調用,顯式拋出帶特殊錯誤號的命名異常;

d、使用語法:raise_application_error(error_no,error_message[,{true|| false}]);

e、錯誤號的范圍是-20,001到-20,999;錯誤信息是文本字符串,最多為2048字節;true和false表示是添加(true)進錯誤堆(error stack)還是覆蓋(overwrite)錯誤堆(false)。缺省情況下是false。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388602.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388602.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388602.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

金融信息交換協議

隨著網絡的使用,目前所有大型的金融機構都已經實現了自動化和數字化。當中肯定少不了互聯網的加入,那么在這當中,我們主要介紹一下FIX協議。它是由國際FIX協會組織提供的一個開放式協議,目的是推動國際貿易電子化的進程&#xff0…

2018大數據學習路線從入門到精通

最近很多人問小編現在學習大數據這么多,他們都是如何學習的呢。很多初學者在萌生向大數據方向發展的想法之后,不免產生一些疑問,應該怎樣入門?應該學習哪些技術?學習路線又是什么?今天小編特意為大家整理了…

相似鄰里算法_紐約市-鄰里之戰

相似鄰里算法IBM Data Science Capstone ProjectIBM Data Science Capstone項目 分析和可視化與服裝店投資者的要求有關的紐約市結構 (Analyzing and visualizing the structure of New York City in relation to the requirements of a Clothing Store Investor) 介紹 (Introd…

一、面向對象

第一節:面向對象編程1.面向對象三大原則:封裝:就是把客觀事物封裝成抽象的類,并且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。繼承:繼承,指可以讓某個類型的對…

[poj 1364]King[差分約束詳解(續篇)][超級源點][SPFA][Bellman-Ford]

題意 有n個數的序列, 下標為[1.. N ], 限制條件為: 下標從 si 到 sini 的項求和 < 或 > ki. 一共有m個限制條件. 問是否存在滿足條件的序列. 思路 轉化為差分約束, 就是 即 Si 為第 i 項的前綴和, 特別的 So 為0. 轉化不等式(連續子段和變為前綴和之差 > < 變為 &g…

linux質控命令,Linux下microRNA質控-cutadapt安裝

如果Linux系統已安裝pip或conda&#xff0c;cutadapt的安裝相對簡便一些&#xff0c;示例如下&#xff1a;1.pip安裝pip install --user --upgrade cutadapt添加環境變量echo export PATH$PATH:/your path/cutadapt-1.10/bin >> ~/.bashrc2.conda安裝conda install -c b…

采用多播傳送FIX行情數據的推薦方案

理由FIX協議由一個會話層協議&#xff0c;一個應用層協議和一套域數據字典組成。后兩者不依賴于FIX會話。而且&#xff0c;由于FIX會話作為Point-to-point&#xff08;點-對-點&#xff09;通信&#xff0c;并不適合于發布/訂閱模式&#xff08;如為大量接收者提供市場數據&…

AJAX 異步加載技術

AJAX 異步 JavaScript 和 XML。 AJAX 是一種用于創建快速動態網頁的技術。 通過在后臺與服務器進行少量數據交換&#xff0c;AJAX 可以使網頁實現異步更新。這意味著可以在不重新加載整個網頁的情況下&#xff0c;對網頁的某部分進行更新。 傳統的網頁&#xff08;不使用 AJAX…

linux分辨率和用戶有關嗎,Linux系統在高分屏非正常分辨率顯示

問題描述&#xff1a;win10重裝為Ubuntu16.04&#xff0c;在1920x1080的顯示屏上&#xff0c;linux系統分辨率只有800x600xrandr # 查看當前顯示分辨率#輸出&#xff1a;[Screen 0: minimum 800 x 600, current 800 x 600, maximum 800 x 600]可以看出顯示屏最小為800x600&…

數據透視表和數據交叉表_數據透視表的數據提取

數據透視表和數據交叉表Consider the data of healthcare drugs as provided in the excel sheet. The concept of pivot tables in python allows you to extract the significance from a large detailed dataset. A pivot table helps in tracking only the required inform…

金融信息交換協議(FIX)v5.0

1. 什么是FIXFinancial Information eXchange(FIX)金融信息交換協議的制定是由多個致力于提升其相互間交易流程效率的金融機構和經紀商于1992年共同發起。這些企業把他們及他們的行業視為一個整體&#xff0c;認為能夠從對交易指示&#xff0c;交易指令及交易執行的高效電子數…

觀光公交

【問題描述】 風景迷人的小城 Y 市&#xff0c;擁有 n 個美麗的景點。由于慕名而來的游客越來越多&#xff0c;Y 市特意安排了一輛觀光公交車&#xff0c;為游客提供更便捷的交通服務。觀光公交車在第 0 分鐘出現在 1 號景點&#xff0c;隨后依次前往 2、3、4……n 號景點。從…

linux行命令測網速,Linux命令行測試網速的方法

最近給服務器調整了互聯網帶寬的限速策略&#xff0c;調到100M讓自己網站也爽一下。一般在windows上我喜歡用speedtest.net來測試&#xff0c;測速結果也被大家認可。在linux上speedtest.net提供了一個命令行工具speedtest-cli&#xff0c;用起來很方便&#xff0c;這里分享一下…

Delphi XE2獲取漢字拼音首字母

function CnPYIndex(const CnString: string): string;{ 返回中文的拼音首字母}const ChinaCode: array[0..25, 0..1] of Integer ((1601, 1636), (1637, 1832), (1833, 2077), (2078, 2273), (2274, 2301), (2302, 2432), (2433, 2593), (2594, 2786), (9999, 0000), …

圖像處理傅里葉變換圖像變化_傅里葉變換和圖像床單視圖。

圖像處理傅里葉變換圖像變化What do Fourier Transforms do? What do the Fourier modes represent? Why are Fourier Transforms notoriously popular for data compression? These are the questions this article aims to address using an interesting analogy to repre…

HDUOJ 1062 TEXT REVERSE

#include<iostream> #include<stdlib.h> #include <iomanip> #include<stack> using namespace std;int main(){//次數int n 0;while (cin >> n) {//這里需要讀一個字符&#xff0c;需要消除換行符的影響getchar();while (n--) {char c;stack&l…

VC++的windows服務

項目建立&#xff1a; VS2008->ATL項目->服務exe 服務部署&#xff1a; 在VS2008中新建的ATL項目&#xff0c;在網上看到的流程中都會有注冊服務這一項。 但是對服務的注冊都是只給了一個指令&#xff0c;一句話帶過&#xff0c;沒有給出具體的操作步驟 經過多次試驗…

linux中gradle編譯慢,【Linux】解決linux下android studio用gradle構建從jcenter或maven下載依賴太慢...

一個簡單的辦法&#xff0c;修改項目根目錄下的build.gradle&#xff0c;將jcenter()或者mavenCentral()替換掉即可&#xff1a;allprojects {repositories {maven{ url http://maven.oschina.net/content/groups/public/}}}但如果你有很多個項目的話&#xff0c;一個一個的改估…

MFC程序需要的函數庫及頭文件--《深入淺出MFC》

Windows程序調用的函數可分為2部分&#xff1a;C Runtimes Windows API。 C Runtimes&#xff1a; LIBC.LIB -- C Runtime函數庫的靜態鏈接版本 MSVSRT.LIB--C Runtime庫的動態鏈接版本&#xff08;如果要鏈接這一函數&#xff0c;你的程序執行時必須有MSVCRT40.DLL在場&#…

C#DNS域名解析工具(DnsLookup)

C#DNS域名解析工具(DnsLookup) DNS域名解析工具&#xff1a;DnsLookup 輸入域名后點擊Resolve按鈕即可。 主要實現代碼如下&#xff1a; private void btnResolve_Click ( object sender, EventArgs e ) {lstIPs.Items.Clear ( ); //首先把結果里的ListBox清空 try {IPHostE…