当前位置: 首页 > news >正文

Oracle数据库pl/sql显式抛出异常

在Oracle PL/SQL中,显式地抛出异常(Raising Exceptions Explicitly)是一种控制程序流程和处理错误的重要机制。当你希望在某些特定条件下中断程序的执行,并通知调用者发生了错误或异常情况时,可以使用这种机制。下面是如何在PL/SQL中显式地抛出异常的几个步骤:

Raising Exceptions Explicitly
To raise an exception explicitly, use either the RAISE statement or RAISE_APPLICATION_ERROR procedure.

Topics

  • RAISE Statement
  • RAISE_APPLICATION_ERROR Procedure

1. 定义异常

首先可以定义一个自定义异常。在PL/SQL中,自定义异常是通过EXCEPTION关键字声明的,但它本身并不包含任何错误信息或代码,它只是一个占位符,用于在后续的代码中被触发(抛出)。

DECLARE-- 定义一个自定义异常my_custom_exception EXCEPTION;-- 其他变量声明...
BEGIN-- 逻辑处理...-- 假设这里有一个条件需要抛出异常IF some_condition THENRAISE my_custom_exception;END IF;EXCEPTIONWHEN my_custom_exception THEN-- 处理异常DBMS_OUTPUT.PUT_LINE('自定义异常被触发');-- 可以添加更多的错误处理逻辑
END;

In Example, the procedure declares an exception named past_due, raises it explicitly with the RAISE statement, and handles it with an exception handler.

CREATE PROCEDURE sp_account_status (due_date DATE,today    DATE
) AUTHID DEFINER
ISpast_due  EXCEPTION;  -- declare exception
BEGINIF due_date < today THENRAISE past_due;  -- explicitly raise exceptionEND IF;
EXCEPTIONWHEN past_due THEN  -- handle exceptionDBMS_OUTPUT.PUT_LINE ('Account past due.');
END;
/BEGINsp_account_status (TO_DATE('2024-09-01', 'yyyy-mm-dd'),TO_DATE('2024-09-20', 'yyyy-mm-dd'));
END;
/
-- Run Result:
Account past due.PL/SQL procedure successfully completed.

2. 使用预定义的异常

Oracle PL/SQL也提供了一系列预定义的异常( Explicitly Raising Predefined Exception),这些异常在Oracle的数据库操作中自动被抛出,例如NO_DATA_FOUND(当SELECT INTO语句未返回任何行时)或VALUE_ERROR(当尝试将值赋给变量时,该值超出了变量的允许范围)。

你可以直接在EXCEPTION部分捕获这些预定义的异常,但你不能直接RAISE它们,因为它们是由Oracle在内部自动触发的。

BEGIN-- 尝试执行一个可能不返回数据的SELECT INTOSELECT column_name INTO variable_name FROM table_name WHERE condition;EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('未找到数据');
END;

In Example, the procedure raises the predefined exception INVALID_NUMBER either explicitly or implicitly, and the INVALID_NUMBER exception handler always handles it.

DROP TABLE t_predefine_exception;
CREATE TABLE t_predefine_exception (col_01 NUMBER);CREATE OR REPLACE PROCEDURE sp_predefine_exception (n  NUMBER) AUTHID DEFINER ISdefault_number NUMBER := 0;
BEGINIF n < 0 THENRAISE INVALID_NUMBER;  -- raise explicitlyELSEINSERT INTO t_predefine_exception VALUES(TO_NUMBER('100.00', '9G999'));  -- raise implicitlyEND IF;
EXCEPTIONWHEN INVALID_NUMBER THENDBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.');INSERT INTO t_predefine_exception VALUES(default_number);
END;
/BEGINsp_predefine_exception(-1);
END;
/
-- Run Result
Substituting default value for invalid number.PL/SQL procedure successfully completed.-- query table 
TESTUSER@FREEPDB1> select * from t_predefine_exception;COL_01
----------0

调用过程,参数传入1,还是一样的结果,因为TO_NUMBER默认不支持逗号作为千位分隔符,所有TO_NUMBER(‘100.00’, ‘9G999’)转换错误,ORA-01722: unable to convert string value containing ‘1’ to a number:因此还是使用预定义的异常。

BEGINsp_predefine_exception(1);
END;
/
-- Run Result
Substituting default value for invalid number.PL/SQL procedure successfully completed.-- query table
TESTUSER@FREEPDB1> select * from t_predefine_exception;COL_01
----------00

用RAISE语句重新引发当前异常
Reraising Current Exception with RAISE Statement
In Example, the handling of the exception starts in the inner block and finishes in the outer block. The outer block declares the exception, so the exception name exists in both blocks, and each block has an exception handler specifically for that exception. The inner block raises the exception, and its exception handler does the initial handling and then reraises the exception, passing it to the outer block for further handling.

DECLAREsalary_too_high   EXCEPTION;current_salary    NUMBER := 20000;max_salary        NUMBER := 10000;erroneous_salary  NUMBER;
BEGINBEGINIF current_salary > max_salary THENRAISE salary_too_high;   -- raise exceptionEND IF;EXCEPTIONWHEN salary_too_high THEN  -- start handling exceptionerroneous_salary := current_salary;DBMS_OUTPUT.PUT_LINE('Salary ' || erroneous_salary ||' is out of range.');DBMS_OUTPUT.PUT_LINE ('Maximum salary is ' || max_salary || '.');RAISE;  -- reraise current exception (exception name is optional)END;EXCEPTIONWHEN salary_too_high THEN    -- finish handling exceptioncurrent_salary := max_salary;DBMS_OUTPUT.PUT_LINE ('Revising salary from ' || erroneous_salary ||' to ' || current_salary || '.');
END;
/
-- Run Result
Salary 20000 is out of range.
Maximum salary is 10000.
Revising salary from 20000 to 10000.PL/SQL procedure successfully completed.

3. 使用RAISE_APPLICATION_ERROR抛出带有错误信息的异常

RAISE_APPLICATION_ERROR过程允许你抛出一个带有自定义错误信息的异常。这对于向客户端或上层调用者提供更多关于错误的信息非常有用。

DECLARE-- 自定义错误号,范围在-20000到-20999之间error_number CONSTANT INTEGER := -20001;
BEGIN-- 假设这里有一个条件需要抛出带有错误信息的异常IF some_condition THENRAISE_APPLICATION_ERROR(error_number, '这里是一个自定义的错误信息');END IF;
END;

使用RAISE_APPLICATION_ERROR时,你可以指定一个错误号(一个负整数,Oracle PL/SQL预定义的范围是从-20000到-20999),以及一个描述错误的字符串。

在例,一个匿名块声明了一个名为past_due的异常,为其分配了错误码-20000,并调用了一个存储过程。存储过程用错误码-20000和一条消息调用RAISE_APPLICATION_ERROR过程,然后控制返回到匿名块,由匿名块处理异常。为了检索与异常相关的消息,匿名块中的异常处理程序调用SQLERRM函数,该函数在“检索错误代码和错误消息”中描述。
In Example, an anonymous block declares an exception named past_due, assigns the error code -20000 to it, and invokes a stored procedure. The stored procedure invokes the RAISE_APPLICATION_ERROR procedure with the error code -20000 and a message, whereupon control returns to the anonymous block, which handles the exception. To retrieve the message associated with the exception, the exception handler in the anonymous block invokes the SQLERRM function, described in “Retrieving Error Code and Error Message”.

CREATE OR REPLACE PROCEDURE sp_account_status_errorcode (due_date DATE,today    DATE
) AUTHID DEFINER
IS
BEGINIF due_date < today THEN                   -- explicitly raise exceptionRAISE_APPLICATION_ERROR(-20000, 'Account past due.');END IF;
END;
/DECLAREpast_due  EXCEPTION;                       -- declare exceptionPRAGMA EXCEPTION_INIT (past_due, -20000);  -- assign error code to exception
BEGINsp_account_status_errorcode (TO_DATE('2024-09-01', 'yyyy-mm-dd'),TO_DATE('2024-09-20', 'yyyy-mm-dd'));   -- invoke procedureEXCEPTIONWHEN past_due THEN                         -- handle exceptionDBMS_OUTPUT.PUT_LINE(TO_CHAR(SQLERRM(-20000)));
END;
/
-- Run Result
ORA-20000: Account past due.PL/SQL procedure successfully completed.

4、 结论

在Oracle PL/SQL中,显式地抛出异常是处理错误和异常情况的重要技术。通过定义自定义异常、使用预定义的异常,以及使用RAISE_APPLICATION_ERROR过程,你可以更灵活地控制程序的执行流程,并向调用者提供有用的错误信息。

相关文章:

Oracle数据库pl/sql显式抛出异常

在Oracle PL/SQL中&#xff0c;显式地抛出异常&#xff08;Raising Exceptions Explicitly&#xff09;是一种控制程序流程和处理错误的重要机制。当你希望在某些特定条件下中断程序的执行&#xff0c;并通知调用者发生了错误或异常情况时&#xff0c;可以使用这种机制。下面是…...

Undet for sketchup 2023.3注册机 支持草图大师sketchup2021-2022-2023

1.Undet for sketchup 2023.3支持草图大师sketchup2021-2022-2023。支持机载雷达扫描、车载扫描还是地面扫描&#xff0c;对AEC行业用户来说&#xff0c;真正需要的是如何将这些数据快速处理为三维模型&#xff0c;这样才能将这些信息延展到BIM领域发挥效用。因此面对这些海量的…...

Java详细学习路线:从入门到精通的全方位指南

Java作为一种广泛使用的编程语言&#xff0c;以其跨平台性、强大的库支持和广泛的应用领域&#xff08;如Web开发、Android开发、大数据处理等&#xff09;而著称。对于初学者来说&#xff0c;制定一个清晰、系统的学习路线至关重要。以下是一个从Java基础到高级应用的详细学习…...

Spark 性能优化高频面试题及答案

目录 高频面试题及答案1. 如何通过调整内存管理来优化 Spark 性能&#xff1f;2. 如何通过数据持久化优化性能&#xff1f;3. 如何通过减少数据倾斜&#xff08;Data Skew&#xff09;问题来优化性能&#xff1f;4. 如何通过优化 Shuffle 操作提升性能&#xff1f;5. 如何通过广…...

【洛谷】AT_abc371_e [ABC371E] I Hate Sigma Problems 的题解

【洛谷】AT_abc371_e [ABC371E] I Hate Sigma Problems 的题解 洛谷传送门 AT传送门 题解 I Hate Sigma Problems!!! 意思很简单就是求序列中每一个子区间内含有不同数字的个数之和。 暴力的话时间复杂度是 O ( n 2 ) O(n ^ 2) O(n2)&#xff0c;是肯定不行的&#xff0…...

【Go】Go 环境下载与安装教程(Windows系统)

引言 Go&#xff0c;也被称为Golang&#xff0c;是一种静态类型&#xff0c;编译型的编程语言&#xff0c;由Google设计和开发。Go语言的设计目标是“解决软件开发中的一些问题”&#xff0c;特别是在大规模软件系统的构建和维护方面。 下载安装包 打开官网下载页面&#xff…...

毕业设计选题:基于springboot+vue+uniapp的驾校报名小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…...

网页通知设计灵感:CSS 和 JS 的 8 大创意实现

文章目录 前言正文1.霓虹灯风格的通知系统2.垂直时间轴通知3.动画徽章通知4.项目式通知5.多种状态通知&#xff1a;成功、错误、警告6.信息、警告、提示组件7.扁平化风格通知8.社交媒体风格弹出通知 总结 前言 网页通知如今已成为电商、社交平台等网站的常见功能&#xff0c;它…...

计算机毕业设计之:基于微信小程序的中药材科普系统(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

C++速通LeetCode中等第6题-找到字符串中所有字母异位词(滑动窗口最详细代码注释)

滑动窗口法&#xff1a; class Solution { public:vector<int> findAnagrams(string s, string p) {unordered_map<char,int> need,window;for(char c : p) need[c];int left 0,right 0;int valid 0;vector<int> res;//窗口数据更新while(right < s.s…...

Tcping:一款实用的端口存活检测工具

简介 tcping 是一个基于TCP协议的网络诊断工具,通过发送 TCP SYN/ACK包来检测目标主机的端口状态。 官网:tcping.exe - ping over a tcp connection 优点: (1)监听服务器端口状态:tcping 可以检测指定端口的状态,默认是80端口,也可以指定其他端口。 (2)显示ping返…...

【每日刷题】Day130

【每日刷题】Day130 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 2. 94. 二叉树的中序遍历 - 力扣…...

书生·浦语作业集合

目录&#xff1a; 1. Linux基础知识 2.python基础知识 3.Git基础知识 4.书生大模型全链路开源体系 1.1-Linux基础知识 配置环境后&#xff0c;运行 hello_word.py 在本地终端中进行端口映射 映射成功后&#xff0c;访问 127.0.0.1&#xff1a;7860 1.2-python基础知识 任务…...

得物App科技创新“再上一层楼”,荣获国家级奖项

近日&#xff0c;在2024中国国际服务贸易交易会&#xff08;简称“服贸会”&#xff09;上&#xff0c;得物App荣获“科技创新服务示范案例”奖项。这是国家层面对得物App以科技创新保障品质消费、提升消费体验成效的肯定。 在得物App上&#xff0c;90后、95后这些曾经的“新生…...

C#软键盘设计字母数字按键处理相关事件函数

应用场景&#xff1a;便携式设备和检测设备等小型设备经常使用触摸屏来代替键盘鼠标的使用&#xff0c;因此在查询和输入界面的文本或者数字输入控件中使用软件盘来代替真正键盘的输入。 软键盘界面&#xff1a;软键盘界面实质上就是一个普通的窗体上面摆放了很多图片按钮&…...

C++笔记---set和map

1. 序列式容器与关联式容器 前面我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间一般没有紧密的关联关…...

HTTP 教程

HTTP/HTTPS 简介 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;和 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff0c;超文本传输安全协议&#xff09;是用于在网络中传输信息的两种主要协议。它们定义了客户端和服务器…...

低代码革命:加速云原生时代的端到端产品创新

随着云计算技术的飞速发展&#xff0c;云原生成为了企业数字化转型的重要方向。云原生技术通过容器化、微服务、持续集成/持续部署&#xff08;CI/CD&#xff09;等实践&#xff0c;帮助企业构建和运行可扩展的应用程序。然而&#xff0c;云原生技术的复杂性也给开发团队带来了…...

力扣 92.反转链表Ⅱ

力扣《反转链表》系列文章目录 刷题次序&#xff0c;由易到难&#xff0c;一次刷通&#xff01;&#xff01;&#xff01; 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段24. 两两交换链表中的节点两个一组反转链表 题解225. K 个一组翻转链表K …...

2024年最新版TypeScript学习笔记——泛型、接口、枚举、自定义类型等知识点

今天带来的是来自尚硅谷禹神2024年8月最新的TS课程的学习笔记&#xff0c;不得不说禹神讲的是真的超级棒&#xff01; 文章目录 TS入门JS中的困扰静态类型检查编译TS命令行编译自动化编译 类型检查变量和函数类型检查字面量类型检查 类型推断类型声明声明对象类型声明函数类型…...

FUTURE POLICE惊艳效果:毫秒级语音字幕对齐实战演示

FUTURE POLICE惊艳效果&#xff1a;毫秒级语音字幕对齐实战演示 1. 为什么需要精准的字幕对齐&#xff1f; 在视频制作和多媒体处理中&#xff0c;字幕与语音的同步问题一直是个痛点。传统字幕制作往往需要人工逐句校对&#xff0c;耗时耗力。而普通语音识别技术虽然能生成文…...

大数据运维--大数据分布式集群

01.运维工程师都有哪些职位&#xff1f;一图胜千言&#xff0c;针对运维工程师在公司都有哪些岗位&#xff0c;我们不妨看看下面这张图2.大数据运维的工作职责 【职责1】规划部署01 根据业务规划和未来业务演进评估集群 规模、存储规模、算力需求、技术选型等。 02 大数据生态组…...

Phi-4-mini-reasoning镜像免配置:预置Prometheus监控指标暴露配置

Phi-4-mini-reasoning镜像免配置&#xff1a;预置Prometheus监控指标暴露配置 1. 模型简介与部署概述 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员&#xff0c;它特别针对数学推…...

Air8101:低功耗-WiFi-UI_SoC模组介绍

一、模组概述 Air8101 是高性能 WiFi SoC 模组&#xff0c;支持2.4G WiFi6与BLE 5.4双模通信&#xff0c;兼容DVP/UVC摄像头接口&#xff0c;可实现200W像素拍照、100W像素录像&#xff08;支持H.264编码及RTMP推流&#xff09;&#xff0c;搭载LuatOS&#xff0c;降低二次开发…...

汉码未来提醒大家:为什么说 “保技术” 才是最真的 “保就业”?

市场上很多培训机构宣传 “包就业”“保薪资”&#xff0c;但从行业真实规则来看&#xff0c;如果技术没有真正掌握&#xff0c;任何就业承诺都缺乏实际支撑。原因非常简单&#xff1a;技术面试无法造假。无论简历如何包装&#xff0c;面试官都会通过现场编码、项目细节追问、技…...

OpenClaw二次开发:基于Qwen3.5-9B定制个性化技能模块

OpenClaw二次开发&#xff1a;基于Qwen3.5-9B定制个性化技能模块 1. 为什么需要自定义技能模块 去年冬天&#xff0c;我发现自己每天早晨都要手动查询天气来决定穿什么衣服。作为一个技术爱好者&#xff0c;我开始思考&#xff1a;能否让OpenClaw自动完成这个任务&#xff1f…...

从安装到实战:在快马平台部署一个基于openclaw的新闻采集demo

今天想和大家分享一个完整的实战项目&#xff1a;在InsCode(快马)平台上从零开始部署一个基于openclaw的新闻采集demo。这个项目特别适合想快速验证爬虫框架能力的朋友&#xff0c;因为平台的一键部署功能让我们能跳过繁琐的环境配置&#xff0c;直接进入实战环节。 为什么选择…...

AD09 PCB设计核心技巧与实战经验

1. PCB设计基础与AD09平台概述作为一名从业超过十年的硬件工程师&#xff0c;我使用过从Protel 99到Altium Designer 21的各种版本&#xff0c;其中AD09&#xff08;Altium Designer 2009&#xff09;因其稳定性和适中的硬件要求&#xff0c;至今仍是许多工程师的首选工具。PCB…...

引爆企业降本增效的AI革命!生成式AI应用专家亲授,从字节跳动到华为的数字化转型实战秘籍!

本文介绍了资深AI专家Mr. Li在生成式AI应用与数字化转型领域的丰富经验&#xff0c;涵盖其在华为、字节跳动等企业的实践经历&#xff0c;以及在多个国家级标准制定和央企数字化转型项目中的参与。Mr. Li提供了一系列关于生成式AI和企业数字化转型的精品课程&#xff0c;旨在帮…...

夜间自动化!OpenClaw调度Qwen3-4B完成凌晨数据备份

夜间自动化&#xff01;OpenClaw调度Qwen3-4B完成凌晨数据备份 1. 为什么需要夜间自动化备份 凌晨三点&#xff0c;我的手机突然弹出服务器告警——又一次因为手动备份遗漏导致磁盘空间不足。作为个人开发者&#xff0c;我意识到需要一套能利用闲置计算资源的自动化方案。传统…...