Oracle数据库---异常处理

本文深入讲解了Oracle数据库中异常处理的多种方式,包括基本的异常处理结构、预定义异常的使用、非预定义异常的定义及处理,以及自定义异常的创建与应用。通过具体的PL/SQL代码示例,展示了如何在不同场景下有效地处理数据库操作中可能出现的各种异常情况。

Oracle异常处理
在PL/SQL语句书写时,需要处理的异常
-- 不做异常处理时
DECLARE
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT ename,sal
INTO v_name,v_sal
FROM emp
WHERE empno = &no;
IF v_sal <3000 THEN
DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal);
END IF;
END;
在不做异常处理的时候,在输入员工编号的值的时候,如果在数据库中没有,就会报错

select * from emp;
--7369(empno) <3000(sal)
--7839 (empno) >3000

--Oracle的异常处理
DECLARE
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT ename,sal
INTO v_name,v_sal
FROM emp
WHERE empno = &no;
IF v_sal <3000 THEN
DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('员工号输入错误!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('其他错误!');
END;

--预定义异常处理
DECLARE
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE:=&salary;
BEGIN
SELECT ename INTO v_name FROM emp WHERE sal = v_sal;
DBMS_OUTPUT.put_line(v_name||'的工资是:'||v_sal);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('没有该工资的员工');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.put_line('多个员工具有该工资');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('其他异常');
END;

SELECT * FROM EMP;
--800(sal), 一个员工
--1250 多个员工
--8000 0个员工

--获取异常的错误代码和错误信息
BEGIN
DELETE FROM DEPT WHERE deptno = &deptno;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(SQLCODE||'####'||SQLERRM);
END;


--非预定义异常的处理
DECLARE
--1:定义非预定义异常的标识符
e_fk EXCEPTION;
--2:将定义好的异常与Oracle错误建立关联
-- -2292错误代码
PRAGMA EXCEPTION_INIT(e_fk,-2292);
BEGIN
DELETE FROM DEPT WHERE deptno = &deptno;
EXCEPTION
--3:捕获并处理异常
WHEN e_fk THEN
DBMS_OUTPUT.PUT_LINE('此部门下有员工,不能删除此部门!');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(SQLCODE||'####'||SQLERRM);
END;

--自定义异常
DECLARE
v_empno emp.empno%TYPE:=&empno;
--1:定义异常
e_no_result EXCEPTION;
BEGIN
UPDATE emp SET sal = sal + 100 WHERE empno = v_empno;
IF SQL%NOTFOUND THEN
--2:指定触发异常的时机
RAISE e_no_result;
ELSE
COMMIT;
END IF;
EXCEPTION
--3:捕捉并处理异常
WHEN e_no_result THEN
DBMS_OUTPUT.put_line('数据更新失败!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('其他错误');
END;

--异常处理函数SQLCODE和SQLERRM的使用
DECLARE
v_empno emp.empno%TYPE:= &empno;
v_ename emp.ename%TYPE:= '&ename';
v_deptno emp.deptno%TYPE:= &deptno;
BEGIN
INSERT INTO emp(empno,ename,deptno)VALUES(v_empno,v_ename,v_deptno);
IF SQL%FOUND THEN
DBMS_OUTPUT.put_line('数据插入成功!');
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('错误号:'||SQLCODE);
DBMS_OUTPUT.put_line('错误信息:'||SQLERRM);
END;

 

转载于:https://www.cnblogs.com/xiaomifeng1010/p/11144211.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值