PL/SQL异常抓取

目录

[1. -- 什么是异常](#1. -- 什么是异常)

[2. 如何捕获预定义异常?](#2. 如何捕获预定义异常?)

3.捕获异常的两个函数

[SQLCODE :为错误代码返回一个数值](#SQLCODE :为错误代码返回一个数值)

[SQLERRM : 返回字符串的数据,包含了与错误相关的信息.](#SQLERRM : 返回字符串的数据,包含了与错误相关的信息.)


1. -- 什么是异常
sql 复制代码
DECLARE
V_JOB EMP.JOB%TYPE;
BEGIN
SELECT JOB INTO V_JOB FROM EMP WHERE JOB ='CLERK';
DBMS_OUTPUT.put_line(V_JOB);  
END;

--出现的错误信息

ORA-01422: 实际返回的行数超出请求的行数

ORA-06512: 在 line 4

-- 本身语法不存在错误,在运行期间发生的错误就被称为异常.当一个异常发生时,这个程序块,被终止.

语法:

sql 复制代码
EXCEPTION 
  WHEN EX_NAME THEN statement1
    WHEN EX_NAME2 THEN statement2
      when others then statement3

-- 对上面的语句进行修改

sql 复制代码
DECLARE
V_JOB EMP.JOB%TYPE:='&请输入职业';
BEGIN
SELECT JOB INTO V_JOB FROM EMP WHERE JOB =V_JOB;
DBMS_OUTPUT.put_line(V_JOB);  

EXCEPTION  WHEN TOO_MANY_ROWS THEN
  DBMS_OUTPUT.put_line('该语句提取多行数据,可以使用游标来解决!');
END;  

-- 使用了 EXCEPTION 进行异常的抓取,并重新定义异常输出
-- 添加了异常后,语句依然存在多行提取的问题,但是代码可以正常执行了.
-- 当一个异常抛出时,程序的控制流程就转移到所定义的异常段,并且执行该异常段的所有语句

2. 如何捕获预定义异常?

-- 就是在对应的异常中引用这个预定义异常的名字
-- 案例:

sql 复制代码
DECLARE 
V_SAL NUMBER;
BEGIN
  -- INSERT INTO EMP(EMPNO,SAL) VALUES (7369,1000);
SELECT 
E.SAL
INTO 
V_SAL
FROM EMP E 
WHERE EMPNO=9999;

EXCEPTION 
  WHEN DUP_VAL_ON_INDEX THEN
    DBMS_OUTPUT.PUT_LINE('违反了唯一性约束!');
  WHEN NO_DATA_FOUND THEN
       DBMS_OUTPUT.PUT_LINE('没有找到数据!');
   WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('其他错误');
END;
3.捕获异常的两个函数

当一个异常发生时,可以通过使用这两个函数来标识相关的错误代码和错误信息,从而基于错误代码的值,或者错误信息决定下一步操作.

SQLCODE:为错误代码返回一个数值

负数: 其他 ORACLE 服务其的错误代码

0 : 没有遇到异常

1 : 用户定义的异常

SQLERRM : 返回字符串的数据,包含了与错误相关的信息.

-- 创建一个存放异常信息的表

sql 复制代码
CREATE TABLE ERROR1
(
USER_NAME VARCHAR2(10),
ERR_DATE DATE ,
ERR_CODE NUMBER,
ERR_MESSAGE VARCHAR2(200)
);

-- 写一个程序,将发生的异常状况信息,存入到表中

sql 复制代码
DECLARE 
-- 定义变量
V_EMPNO EMP.EMPNO%TYPE:=&请输入员工编号; 

-- 定义获取异常的变量
V_ERR_CODE NUMBER;
V_ERR_MESSAGE VARCHAR2(200);
BEGIN
  INSERT INTO EMP (EMPNO) VALUES (V_EMPNO);
 
EXCEPTION 
  WHEN OTHERS THEN 
    ROLLBACK;
    V_ERR_CODE:=SQLCODE;
    V_ERR_MESSAGE:=SQLERRM;
    -- 将错误信息插入到表中
INSERT INTO  ERROR1 (USER_NAME,ERR_DATE,ERR_CODE,ERR_MESSAGE)
 VALUES(USER,SYSDATE,V_ERR_CODE,V_ERR_MESSAGE);

-- 提交数据
END;

SELECT * FROM ERROR1;

相关推荐
ClickHouseDB4 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906944 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
时间售卖铺5 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw6 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社6 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
lbb 小魔仙7 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
captain3768 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02148 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川9 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组9 小时前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制