oracle的異常處理

oracle提供了預定義例外、非預定義例外和自定義例外三種類型。其中:

l預定義例外用于處理常見的oracle錯誤;

l非預定義例外用于處理預定義所不能處理的oracle錯誤;

l自定義例外處理與oracle錯誤無關的其他情況。

Oracle代碼編寫過程中,如果捕捉例外則會在plsql塊內解決運行錯誤,否則將錯誤傳遞到調用環境。

常用預定義例外:

為了處理各種常見的oracle錯誤,plsql為開發人員提供了二十多個預定義例外,每個預定義例外都對應一個oracle系統錯誤。

Access_info_null(ora-06530):當訪問沒有初始化的對象時觸發。

Case_not_found(ora-06592):在case過程中when后沒有包含必要的條件分支并且沒有else子句,則會觸發本異常。

Collection_is_null(ora-06531):訪問未初始化的集合元素(嵌套表或者varray)。

Cursor_already_open(ora-06511):重新打開已經打開的游標。

Dup_val_on_index(ora-00001):當中唯一索引所對應的列上鍵入重復值時。

Invalid_cursor(ora-01001):試圖在不合法的游標上執行操作時,譬如沒打開游標就提取內容。

Invalid_number(ora-01722):當試圖將非法的字符串轉換為數字類型時。

No_data_found(ora-01403):執行select into未返回行,或者引用了索引表未初始化的元素時。

Too_many_rows(ora-01422):執行select into返回超過一行數據時。

Zero_divide(ora-01476):0作為被除數時。

Subscript_beyond_count(ora-06533):使用嵌套表或者varray集合時,如果引用下標超過last。

Subscript_outside_limit(ora-06532):使用嵌套表或varray集合時,如果引用下標小于first。

Value_error(ora-06502):在執行賦值操作時,如果變量長度不足以容納實際數據。

Login_denied(ora-01017):連接數據庫時提供了不正確的用戶名或口令。

Not_logged_on(ora-01012):在程序沒有連接到oracle數據庫時執行plsql代碼則會觸發。

Program_error(ora-06501):plsql內部問題。

Rowtype_mismatch(ora-06504):執行賦值操作時,如果宿主游標變量和PLSQL游標變量返回類型不兼容時。

Self_is_null(ora-30625):使用對象類型時,如果在null實例上調用成員方法。

Storage_error(ora-06500):超出內存空間或者內存被損壞。

Sys_invalid_rowid(ora-01410):無效字符串企圖轉換為rowid類型時。

Timeout_on_resource(ora-00051):等待資源時出現超時錯誤。

處理非預定義例外:

上面描述的21中預定義之外的其他oracle錯誤通稱為非預定義例外,對這種例外的處理包括三步:首先的定義部分定義例外;然后使用progma exception(exception_name,exception_number) 在例外和oracle錯誤之間建立關聯,這時要求用戶知道可能出現的錯誤號(例外函數sqlcode、sqlerrm和raise_application_error);最終在例外處理部分捕捉并處理例外。

DeclareE_integrity exceptionPragma exception_init(e_integrity,-2291);BeginSqlstatement;ExceptionWhen e_integrity thenDbms_output.put_line(‘數據完整性錯誤。’);End;

處理自定義例外:

預定義例外和非預定義例外都跟oracle錯誤有關,而自定義例外則是用戶根據業務處理時特定的情況而自定義的例外。使用自定義例外時,首先需要在定義部分declare定義例外,然后在執行部分觸發例外(使用raise語句),最后在例外處理部分捕捉并處理例外。

declaremyexception exception;beginif1=0 thenraise myexception;endif;exceptionwhen myexception thendbms_output.put_line('asdf');end;

使用例外函數:

oracle內置函數sqlcode和sqlerrm主要用在others處理器中,分別用來返回oracle的錯誤代碼和錯誤消息。一般情況下sqlcode返回負數標識的oracle錯誤代碼,除非錯誤為‘ora-01403:no data found’此時對應的sqlcode為+100,對于用戶自定義的異常,sqlcode返回+1,如果沒有異常被觸發,sqlcode返回0。

BeginExceptionWhen others thenDbms_output.put_line(sqlcode||sqlerrm(sqlcode));End;

Oracle過程raise_application_error用于在plsql應用程序中自定義錯誤消息。注意該過程只能在數據庫端的子程序(過程、函數、包、觸發器)中使用,而不能在匿名塊和客戶端的子程序中使用。語法為raise_application_error(error_number,message[,[true|false]]);其中error_number用于定義錯誤號,該錯誤號必須在-20000到-20999之間的負整數;message用于指定錯誤消息,并且該消息的長度不能超過2048字節;第三個參數如果為true,則該錯誤會被放在先前錯誤堆棧中,如果為false(默認值)則會替代先前所有錯誤。

plsql編譯警告:

plsql警告可以分為三類,severe用于檢查可能出現的不可預料或者錯誤結果,例如參數的別名問題;performance用于檢查可能引起的性能問題,例如執行insert操作時為number列提供了varchar2類型數據;informational用于檢查子程序中的死代碼;all用于檢查所有警告。為了數據庫可以在編譯plsql子程序時發出警告信息,需要設置初始化參數plsql_warnings。這個參數不僅可以在系統級或者會話級設置,也可以在alter procedure命令中設置。Alter {system|session|procedure} set plsql_warnings=’{enable|disable:{all |performance|severe|informational}}’;為了檢查是否存在對應警告信息,必須先激活警告檢查,然后重新編譯子程序,最后使用show errors命令顯示警告錯誤。

create or replace procedure my_testisbeginif1=0thendbms_output.put_line('test');endif;end;SQL> alter procedure my_test compile plsql_warnings = 'enable:all';Procedure alteredSQL> show errors;Errors for PROCEDURE SYS.MY_TEST:LINE/COL ERROR-------- -------------------------10/5???? PLW-06002: 無法執行的代碼————————————————

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

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

相關文章

nginx反向代理與負載均衡

負載均衡依靠反向代理實現。nginx的代理分為七層代理與四層代理: 七層代理:七層代理的就是http請求和響應。七層代理是最常用的反向代理方式,只能配置在nginx配置文件的http模塊。而且配置方法名稱:upstream模塊,不能寫…

提升效率!Go語言開發者不可錯過的必備工具集合!

🌷🍁 博主貓頭虎 帶您 Go to Golang Language.??🍁 🦄 博客首頁——貓頭虎的博客🎐 🐳《面試題大全專欄》 文章圖文并茂🦕生動形象🦖簡單易學!歡迎大家來踩踩~&#x1…

UDP數據報網絡編程(實現簡單的回顯服務器,客戶端)

回顯服務器表示客戶端發的是啥,服務器就返回啥,主要是為了熟悉UDP數據報網絡編程的基本步驟 對于程序的所有分析都寫到了代碼上 UDP回顯服務器代碼 package UdpEcho;import java.io.IOException; import java.net.DatagramPacket; import java.net.Dat…

ClickHouse查看執行計劃(EXPLAIN語法)

1.EXPLAIN 語法示例 EXPLAIN [AST | SYNTAX | QUERY TREE | PLAN | PIPELINE | ESTIMATE | TABLE OVERRIDE] [setting value, ...] [ SELECT ... | tableFunction(...) [COLUMNS (...)] [ORDER BY ...] [PARTITION BY ...] [PRIMARY KEY] [SAMPLE BY ...] [T…

途樂證券-最準確的KDJ改良指標?

KDJ目標是技術剖析的一種重要目標之一,它是利用隨機目標(%R)發展而來的,是一種反映商場超買和超賣狀況的買賣目標。KDJ目標由快線(K線)、慢線(D線)和隨機值(J線&#xff…

RestTemplate HTTPS請求忽略SSL證書

問題描述 使用RestTemplate發送HTTPS請求的時候,出現了這樣的一個問題: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification …

MySQL多表查詢

1.創建student和score表 創建score表 2.為student表和score表增加記錄 向student表插入記錄的INSERT語句如下: 向score表插入記錄的INSERT語句如下: 1.查詢student表的所有記錄 2.查詢student表的第2條到4條記錄 3.從student表查詢所有學生的學號&#…

2023最新影視泛目錄系統,蘋果cms最新下載地址

影視泛目錄系統是指一種集成了電影、電視劇、綜藝節目、動漫等多種影視資源資源的系統,其目的是為用戶提供一個方便快捷的影視資源檢索、瀏覽、分享、評論的平臺。該系統通過對影視資源進行分類、標簽化、評分等方式,為用戶提供更加精準的檢索和推薦服務…

C#多線程學習 生產者和消費者

前面說過,每個線程都有自己的資源,但是代碼區是共享的,即每個線程都可以執行相同的函數。這可能帶來的問題就是幾個線程同時執行一個函數,導致數據的混亂,產生不可預料的結果,因此我們必須避免這種情況的發…

mousedown拖拽功能(vue3+ts)

因為項目有rem適配,使用第三方插件無法處理適配問題,所有只能自己寫拖拽功能了 拖拽一般都會想到按下,移動,放開,但是本人親測,就在div綁定一個按下事件就行了(在事件里面寫另外兩個事件&#x…

爬蟲ip池越大越好嗎?

作為一名資深的程序員,今天我要給大家分享一些關于爬蟲ip池的知識。關于ip代理池的問題,答案是肯定的,池子越大越好。下面跟我一起來盤點一下ip池大的好處吧! 1、提高穩定性 爬蟲ip池越大,意味著擁有更多可用的爬蟲ip…

「C/C++」C/C++搭建程序框架

?博客主頁何曾參靜謐的博客📌文章專欄「C/C」C/C程序設計📚全部專欄「UG/NX」NX二次開發「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序設計「C/C」C/C程序設計「Win」Windows程序設計「DSA」數據結構與算法「File」數據文件格式 目錄 1. 分離職…

Flume原理剖析

一、介紹 Flume是一個高可用、高可靠,分布式的海量日志采集、聚合和傳輸的系統。Flume支持在日志系統中定制各類數據發送方,用于收集數據;同時,Flume提供對數據進行簡單處理,并寫到各種數據接受方(可定制&…

使用阿里云服務器搭建Discuz論壇網站教程基于CentOS系統

阿里云百科分享使用阿里云服務器建站教程,本文是搭建Discuz論壇,Discuz!是一款通用的社區論壇軟件系統,它采用PHP和MySQL組合的基礎架構,為您提供高效的論壇解決方案。本文介紹如何在CentOS 7操作系統的ECS實例上搭建Discuz! X3.4…

Nginx 安裝與部署

文章和代碼已經歸檔至【Github倉庫:https://github.com/timerring/front-end-tutorial 】或者公眾號【AIShareLab】回復 nginx 也可獲取。 文章目錄 虛擬機安裝CentOS7.4Linux配置配置上網配置靜態ip Nginx的安裝版本區別備份克隆 安裝編譯安裝報錯解決 啟動Nginx防…

topo 成績排名

題目描述 每到考試后,學校都會發成績表給每個學生,但是很多同學更關心的是自己在班級里的排名,可惜排名信息并沒有公開。 小雯同學很想知道這次期末考試的全班排名情況,但是她的同學卻不愿意告訴她自己的分數,只告訴她…

分布式 - 消息隊列Kafka:Kafka生產者發送消息的方式

文章目錄 1. Kafka 生產者2. kafaka 命令行操作3. kafka 生產者發送消息流程4. Kafka 生產者的創建5. Kafka 生產者發送消息1. 發送即忘記2. 同步發送3. 異步發送 6. Kafka 消息對象 ProducerRecord 1. Kafka 生產者 不管是把Kafka作為消息隊列、消息總線還是數據存儲平臺&…

wpf控件上移下移,調整子集控件顯示順序

頁面代碼: <!-- 導出A2,自定義導出設置列,添加時間:2023-8-9 14:14:18,作者:whl; --><Window x:Class="WpfSnqkGasAnalysis.WindowGasExportA2"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http:/…

git遠程倉庫的創建及使用

1.倉庫的概念&#xff1a; 1.1 本地倉庫&#xff1a; 了解遠程倉庫前我們先了解一下本地倉庫&#xff0c;本地倉庫開發人員在完成部分代碼的編寫之后&#xff0c;可以將這一部分的代碼做一個提交。這個提交完全就是一個新的版本提交&#xff0c;當然這個提交動作是在開發者的電…

CSS革命:用Sass/SCSS引領前端創新

目錄 前言SCSSSassSass 和 SCSS 的區別 前言 在現代的前端開發中&#xff0c;CSS已成為呈現網頁和應用程序樣式的核心。然而&#xff0c;原生的CSS語法在大型項目中可能變得混亂、冗長且難以維護。 為了解決這些問題&#xff0c;SCSS&#xff08;Sass CSS&#xff09;和Sass&am…