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

Oracle中的异常处理与自定义异常

目录

一、什么是异常处理

二、异常的两种分类

三、常见的预定义异常

四、异常处理语法

五、异常常用的三种方案

六、使用RAISE_APPLICATION_ERROR创建自定义错误码

七、异常练习 


一、什么是异常处理

        程序因为数据的原因或者入参的原因,导致程序出错,这个时候,为了面对这种不可避免的问题,程序块里面添加了异常处理,当程序异常的时候,该怎么办,可以在异常中定义。

二、异常的两种分类

(1) 系统预定义:Oracle 自动抛出(如:'违反唯一性约束')

(2) 用户自定义:编码人员认为的 '非正常情况' ( v_exp1 EXCEPTION)

                           其中 '用户自定义' 的异常在 pl/sql 环境使用,需 '显式抛出'。

三、常见的预定义异常

异常名称错误代码说明
NO_DATA_FOUNDORA-01403查询无结果
TOO_MANY_ROWSORA-01422查询返回多行,而 INTO 只接收一行
DUP_VAL_ON_INDEXORA-00001违反唯一约束
ZERO_DIVIDEORA-01476除数为零
INVALID_NUMBERORA-01722字符串转数字失败
TIMEOUT_ON_RESOURCEORA-00051等待资源超时

四、异常处理语法

EXCEPTIONWHEN [OTHERS] -- 异常场景THEN  -- 则做的事情

五、异常常用的三种方案

RAISE  异常抛出  --程序不接着往下执行
NULL   忽略异常
ROLLBACK 异常回滚  --程序出现异常则回滚 程序的相关操作(UPDATE/INERT/DELETE)

捕捉异常的关键字是  SQLERRM 它能够得到 异常的详细信息

六、使用RAISE_APPLICATION_ERROR创建自定义错误码

自定义异常参数:使用RAISE_APPLICATION_ERROR抛出带自定义错误码和消息的异常。

开发者自定义的错误码,范围为-20000-20999

DECLAREv_salary NUMBER := 100000;
BEGINIF v_salary > 50000 THENRAISE_APPLICATION_ERROR(-20001, '工资超出上限'); -- 自定义错误码END IF;
END;

 

七、异常练习 

declarev_num          number := &input;exp_date_range exception; -- 异常定义
beginif v_num < 0 thenraise exp_date_range; -- 异常抛出end if;dbms_output.put_line(v_num);
exceptionwhen exp_date_range thendbms_output.put_line('数据范围不能为负数!');
end;

                         

捕捉异常信息:示例:将EMP表的数据同步到EMP表(把EMP表的数据重复两遍)

create or replace procedure p_16 is
begininsert into empselect * from emp;commit;
exceptionwhen others thendbms_output.put_line(SQLERRM);
end;BEGINp_16;
end;

 

示例:入参员工编号,打印对应员工的姓名

程序出现异常之后,忽略使用null;当出现异常的时候,让程序跳出执行  弹出一个报错的框 即抛出异常

create or replace procedure p_17(p_empno number) isv_name varchar2(10);
beginselect ename into v_name from emp where empno = p_empno;dbms_output.put_line(v_name);
exceptionwhen others thendbms_output.put_line(SQLERRM);null;raise; -- 弹出窗口-- rollback;-- 也可以进行回滚-- 注意:raise语句会重新抛出当前异常,导致后续的 rollback; 永远不会执行
end;BEGINp_17(p_empno=>1111);
end;

程序出现异常,则回滚

下面是一个匿名 PL/SQL 块:

DECLAREdept_no NUMBER(2) := 70;
BEGIN--开始事务INSERT INTO dept VALUES (70, '市场部', '北京'); --插入部门记录INSERT INTO dept VALUES (70, '后勤部', '上海'); --插入相同编号的部门记录        INSERT INTO emp --插入员工记录VALUES(7997, '威尔', '销售人员', NULL, TRUNC(SYSDATE), 5000, 300, 70);--提交事务COMMIT;EXCEPTIONWHEN OTHERS THEN--捕捉异常DBMS_OUTPUT.PUT_LINE(SQLERRM); --显示异常消息ROLLBACK;                --回滚异常
END;

因为dept表的主键插入重复,所以捕捉到异常,数据回滚,
插入emp表的语句在插入dept表之后,dept表未插入成功,emp表的语句不会跑,
因此两张表都插入失败

http://www.xdnf.cn/news/918073.html

相关文章:

  • Redis 与 MySQL 数据一致性保障方案
  • Ctrl-Crash 助力交通安全:可控生成逼真车祸视频,防患于未然
  • chili3d 笔记17 c++ 编译hlr 带隐藏线工程图
  • Jenkins持续集成CI,持续部署CD,Allure报告集成以及发送电子 邮件
  • STM32标准库-输入捕获
  • PySide6 GUI 学习笔记——常用类及控件使用方法(多行文本控件QTextEdit)
  • Redis高可用架构
  • CCPC chongqing 2025 H
  • PySide6 GUI 学习笔记——常用类及控件使用方法(单行文本控件QLineEdit)
  • Linux进程(中)
  • Java高级 |【实验八】springboot 使用Websocket
  • 174页PPT家居制造业集团战略规划和运营管控规划方案
  • 【android bluetooth 协议分析 15】【SPP详解 1】【SPP 介绍】
  • ThinkPHP 5.1 中的 error 和 success 方法详解
  • 【LangchainAgent】Agent基本构建与使用
  • 基于Spring Boot的云音乐平台设计与实现
  • Vue3 项目的基本架构解读
  • K8S认证|CKS题库+答案| 6. 创建 Secret
  • Gartner《How to Create and Maintain a Knowledge Base forHumans and AI》学习报告
  • 学习使用YOLO的predict函数使用
  • Android 平台RTSP/RTMP播放器SDK接入说明
  • 现代简约壁炉:藏在极简线条里的温暖魔法
  • 数据库(sqlite)基本操作
  • 量子计算突破:新型超导芯片重构计算范式
  • Axure应用交互设计:注册登录页完整交互设计
  • Web前端基础
  • Axure应用交互设计:如何构建注册登录页
  • AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
  • 1.5 Node.js 的 HTTP
  • 9.进程间通信