Oracle中自定義異常內置異常嵌套異常的捕獲處理

一、異常類型分類

類型說明示例
內置預定義異常Oracle已命名異常(如NO_DATA_FOUND)查詢無數據時觸發
內置非預定義異常未命名的Oracle錯誤(需用PRAGMA EXCEPTION_INIT關聯)ORA-02290(違反檢查約束)
自定義異常用戶定義的業務邏輯異常數據校驗失敗時手動拋出

二、異常處理語法
1. 基本結構

DECLARE-- 聲明自定義異常custom_exception EXCEPTION;-- 綁定錯誤代碼到非預定義異常PRAGMA EXCEPTION_INIT(custom_exception, -20001);
BEGIN-- 業務邏輯IF 條件 THENRAISE custom_exception; -- 手動拋出異常END IF;
EXCEPTIONWHEN custom_exception THENDBMS_OUTPUT.PUT_LINE('自定義異常觸發');WHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('數據未找到');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('錯誤代碼: ' || SQLCODE);DBMS_OUTPUT.PUT_LINE('錯誤信息: ' || SQLERRM);
END;

三、異常語法
1. 自定義異常
步驟說明:

①聲明異常:

DECLAREinvalid_salary EXCEPTION;

②關聯錯誤代碼(可選):

PRAGMA EXCEPTION_INIT(invalid_salary, -20001);

③拋出異常:

IF salary < 0 THENRAISE invalid_salary;
END IF;

④捕獲處理:

EXCEPTIONWHEN invalid_salary THENDBMS_OUTPUT.PUT_LINE('薪資不能為負數');

2. 內置異常處理
常用預定義異常:
NO_DATA_FOUND: SELECT未找到數據
TOO_MANY_ROWS: SELECT返回多行數據
ZERO_DIVIDE: 除數為零
DUP_VAL_ON_INDEX: 唯一索引沖突

-- 示例:
BEGINSELECT * INTO emp_rec FROM emp WHERE emp_id = 999;
EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('員工ID不存在');WHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE('返回多行數據');
END;

3. 嵌套異常處理
結構示例:

DECLAREouter_exception EXCEPTION;
BEGIN<<inner_block>>DECLAREinner_exception EXCEPTION;BEGINRAISE inner_exception;EXCEPTIONWHEN inner_exception THENDBMS_OUTPUT.PUT_LINE('內部異常已處理');RAISE outer_exception; -- 拋出到外層END inner_block;
EXCEPTIONWHEN outer_exception THENDBMS_OUTPUT.PUT_LINE('外部捕獲到異常');
END;

詳細實例:

DECLARE-- 定義變量和異常v_employee_id employees.employee_id%TYPE := 100;v_salary employees.salary%TYPE;e_negative_salary EXCEPTION; -- 自定義異常:工資為負PRAGMA EXCEPTION_INIT(e_negative_salary, -20001); -- 綁定錯誤代碼
BEGIN-- 外層塊BEGIN -- 內層塊開始-- 嘗試獲取員工工資SELECT salary INTO v_salary FROM employees WHERE employee_id = v_employee_id;-- 模擬業務邏輯:檢查工資有效性IF v_salary < 0 THENRAISE_APPLICATION_ERROR(-20001, '工資不能為負數'); -- 觸發自定義異常END IF;DBMS_OUTPUT.PUT_LINE('內層塊:工資處理成功。');EXCEPTION -- 內層異常處理WHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('內層塊:員工ID ' || v_employee_id || ' 不存在。');RAISE; -- 重新拋出到外層WHEN e_negative_salary THENDBMS_OUTPUT.PUT_LINE('內層塊:異常 - ' || SQLERRM);-- 此處可添加恢復邏輯,如設置默認工資v_salary := 0;DBMS_OUTPUT.PUT_LINE('內層塊:工資已重置為0。');END; -- 內層塊結束-- 外層業務邏輯(內層未異常終止時執行)DBMS_OUTPUT.PUT_LINE('外層塊:更新后工資為 ' || v_salary);EXCEPTION -- 外層異常處理WHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('外層塊:錯誤 - 指定員工不存在。');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('外層塊:未知錯誤 - ' || SQLERRM);ROLLBACK; -- 示例事務回滾
END;

嵌套結構:

  • 內層塊: 處理具體數據庫操作(如查詢、業務驗證),捕獲NO_DATA_FOUND(預定義)和自定義異常。
  • 外層塊: 處理內層未處理的異常,執行后續業務邏輯或全局錯誤處理。

異常傳播:

  • 內層處理并解決: 如e_negative_salary異常被捕獲后重置工資,程序繼續執行外層代碼。
  • 內層重新拋出: NO_DATA_FOUND在內層處理后通過RAISE傳遞到外層,觸發外層對應處理程序。

自定義異常:

  • 使用RAISE_APPLICATION_ERROR拋出并關聯錯誤代碼,PRAGMA
    EXCEPTION_INIT將自定義異常綁定到特定錯誤號。

事務控制:

  • 外層異常處理中可包含ROLLBACK,確保數據一致性(根據實際業務需求調整)。

嵌套規則:

  • 內部塊未處理的異常會自動傳遞到外層塊
  • 使用RAISE可手動將異常傳遞到上層

四、其他處理
1. 錯誤日志記錄

EXCEPTIONWHEN OTHERS THENINSERT INTO error_log (code, message, time)VALUES (SQLCODE, SQLERRM, SYSDATE);COMMIT;RAISE; -- 繼續向上層傳遞異常
END;

2. 動態錯誤消息

RAISE_APPLICATION_ERROR(-20001, '訂單 ' || order_id || ' 狀態無效');

3. 異常傳播控制

BEGIN-- 業務邏輯
EXCEPTIONWHEN OTHERS THENIF SQLCODE = -2290 THENDBMS_OUTPUT.PUT_LINE('約束違反');ELSERAISE; -- 繼續傳播未明確處理的異常END IF;
END;

五、總結
優先級處理:

EXCEPTIONWHEN NO_DATA_FOUND THEN ... -- 特定異常在前WHEN OTHERS THEN ...        -- 通用處理在后

事務控制:

BEGINSAVEPOINT sp1;-- DML操作
EXCEPTIONWHEN OTHERS THENROLLBACK TO sp1;RAISE;
END;

錯誤代碼規范:

  • 自定義錯誤代碼范圍:-20000 到 -20999
  • 統一錯誤消息格式

通過合理使用異常處理機制,可顯著提升Oracle程序的健壯性。建議在復雜業務邏輯中優先定義清晰的異常處理策略。

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

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

相關文章

《Flutter社交應用暗黑奧秘:模式適配與色彩的藝術》

暗黑模式已從一種新奇的功能演變為用戶體驗中不可或缺的一環。對于Flutter開發者而言&#xff0c;如何在社交應用中完美實現暗黑模式適配與色彩對比度優化&#xff0c;是一場充滿挑戰與驚喜的技術探索之旅。 暗黑模式&#xff0c;絕非僅僅是將界面顏色反轉這么簡單。從用戶體驗…

【kubernetes】通過Sealos 命令行工具一鍵部署k8s集群

一、前言 1、sealos安裝k8s集群官網&#xff1a;K8s > Quick-start > Deploy-kubernetes | Sealos Docs 2、本文安裝的k8s版本為v1.28.9 3、以下是一些基本的安裝要求&#xff1a; 每個集群節點應該有不同的主機名。主機名不要帶下劃線。所有節點的時間需要同步。需要…

視覺-語言-動作模型:概念、進展、應用與挑戰(上)

25年5月來自 Cornell 大學、香港科大和希臘 U Peloponnese 的論文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 視覺-語言-動作 (VLA) 模型標志著人工智能的變革性進步&#xff0c;旨在將感知、自然語言理解和具體動作統一在一個計…

Java筆記4

第一章 static關鍵字 2.1 概述 以前我們定義過如下類&#xff1a; public class Student {// 成員變量public String name;public char sex; // 男 女public int age;// 無參數構造方法public Student() {}// 有參數構造方法public Student(String a) {} }我們已經知道面向…

記一次redis未授權被種挖礦

#挖礦程序 /etc/httpgd /etc/nnt.sh #大小問 #定時任務名為root /var/spool/cron/root 內容&#xff1a;*/50 * * * * sh /etc/nnt.sh >/dev/null 2>&1 定時任務只有所有者可以寫&#xff0c;且chmod修改權限失敗。 #先查看定時任務的拓展屬性&#xff0c;不可變(i…

Excel分組計算求和的兩種實現方案

文章目錄 背景樣例數據方案一、函數求和實現步驟缺點 方案二、數據透視表實現步驟優點 背景 在Excel文檔中&#xff0c;經常會進行數據的求和計算&#xff0c;可使用不同的方式實現&#xff0c;記錄下來&#xff0c;方便備查。 樣例數據 已有商品銷量信息&#xff0c;包含銷…

如何應對網站被爬蟲和采集?綜合防護策略與實用方案

在互聯網時代&#xff0c;網站內容被惡意爬蟲或采集工具竊取已成為常見問題。這不僅侵犯原創權益&#xff0c;還可能影響網站性能和SEO排名。以下是結合技術、策略與法律的綜合解決方案&#xff0c;幫助網站構建有效防護體系。 一、技術防護&#xff1a;阻斷爬蟲的“技術防線”…

網卡網孔速率的協商是如何進行的?

網卡與交換機等網絡設備之間的速率協商主要通過**自動協商&#xff08;Auto-Negotiation&#xff09;**機制實現&#xff0c;其核心是物理層&#xff08;PHY&#xff09;芯片之間的信息交互。以下是協商過程的詳細解析&#xff1a; 一、自動協商的核心流程 1. 發送配置幀&am…

FastExcel 本地開發和Linux上上傳Resource文件的差異性

不能直接通過路徑來獲取 這個是一個下載導出文件的操作 GetMapping(value "/export/all") public void exportAll(HttpServletResponse response, LaylineListReq req) throws IOException {// 從類路徑下獲取 Excel 文件資源ClassPathResource classPathResource…

【RAG】Milvus、Pinecone、PgVector向量數據庫索引參數優化

Milvus 、PgVector 索引參數優化 IVF類索引關鍵參數&#xff08;基于聚類算法&#xff09; nlist (倒排列表數量): 決定將向量空間劃分為多少個聚類中心值越大搜索越精確但耗時越長推薦值: 通常設置為數據量的4√n到n/1000之間例如: 1百萬數據量可設nlist1000到4000 nprobe (搜…

5月12日信息差

一、國際政治與安全:俄烏沖突與中美博弈 1. 烏克蘭戰場信息分化 俄方戰報: 俄羅斯國防部宣稱在頓巴斯地區摧毀烏軍12輛坦克及3套美制“海馬斯”火箭系統,稱烏軍反攻受阻。 信息特點:強調裝備摧毀數量,淡化前線實際控制變化。 烏方通報: 烏克蘭總參謀部表示已奪回巴赫穆特…

Python如何使用進行風險管理和投資組合優化

文章目錄 前言python3.13 環境配置風險管理投資組合優化 前言 在 Python 中&#xff0c;可以使用多個庫來進行風險管理和投資組合優化&#xff0c;以下是一些常見的方法和庫。 python3.13 環境配置 python3.13安裝教程&#xff1a;https://blog.csdn.net/2501_91538706/artic…

C++ 狀態模式詳解

狀態模式&#xff08;State Pattern&#xff09;是一種行為設計模式&#xff0c;它允許一個對象在內部狀態改變時改變其行為&#xff0c;使對象看起來像是改變了其類。 核心概念 設計原則 狀態模式遵循以下設計原則&#xff1a; 單一職責原則&#xff1a;將狀態相關行為分離…

Html5新特性_js 給元素自定義屬性_json 詳解_淺克隆與深克隆

文章目錄 1. html5新特性2.用 js 給元素自定義屬性3.json3.1 json與普通對象的區別3.2 json對象與 js對象的轉化 4.淺克隆和深克隆 1. html5新特性 html5中引入了新的特性&#xff08;新的標簽&#xff09;&#xff0c;下面的新標簽是新的結構標簽&#xff0c;不過不太常用 h…

std::move 和 std::forward

關聯點 都是執行轉換(cast)的函數&#xff08;函數模板&#xff09;&#xff0c;不產生任何可執行代碼。且都可以把實參轉換成右值。 std::move無條件將實參&#xff08;const除外 &#xff09;轉換成右值引用&#xff0c;std::forward 條件返回右值引用 _EXPORT_STD template…

Uniapp編寫微信小程序,使用canvas進行繪圖

一、canvas文檔&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial 二、數據繪制&#xff08;單位是像素&#xff09;&#xff1a; 1、繪制文本&#xff1a; 文字的長度超過設置的最大寬度&#xff0c;文字會縮在一起 ① 填充文本&#xf…

FLASH閃存(擦除、編譯)

FLASH閃存 文章目錄 FLASH閃存1.存儲器映像位置2.FLASH簡介3.閃存模塊組織3.2閃存的共性&#xff1a; 4.FLASH基本結構4.1FLASH解鎖4.2使用指針訪問寄存器 5.選項字節5.1選項字節編程5.2選項字節擦除 6.相關函數介紹7.讀取內部FLASH&#xff08;實操&#xff09;7.1接線圖7.2工…

PostgreSQL 序列(Sequence) 與 Oracle 序列對比

PostgreSQL 序列(Sequence) 與 Oracle 序列對比 PostgreSQL 和 Oracle 都提供了序列(Sequence)功能&#xff0c;但在實現細節和使用方式上存在一些重要差異。以下是兩者的詳細對比&#xff1a; 一 基本語法對比 1.1 創建序列 PostgreSQL: CREATE [ { TEMPORARY | TEMP } |…

12.2.2 allocator類

allocator類將分配內存空間、調用構造函數、調用析構函數、釋放內存空間這4部分操作分開&#xff0c;全部交給程序員來執行&#xff0c;不像new和delete #include <iostream> #include <string>int main() {const int n 10;std::allocator<std::string> al…

Android 中 Handler (創建時)內存泄漏問題及解決方案

一、Handler 內存泄漏核心原理 真題 1&#xff1a;分析 Handler 內存泄漏場景 題目描述&#xff1a; 在 Activity 中使用非靜態內部類 Handler 發送延遲消息&#xff0c;旋轉屏幕后 Activity 無法釋放&#xff0c;分析原因并給出解決方案。 內存泄漏鏈路分析&#xff1a; 引…