欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle数据库---异常处理

程序员文章站 2023-01-13 11:01:34
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 empn ......

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;