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;
如对本文有疑问, 点击进行留言回复!!
Oracle 基本概念 Dadabase,schema,user,table...
dbeaver连接Oracle中文乱码的解决方案--druid
Oracle常用语句(时间格式、去重、去特殊符号、查询表空间等)
Navicate 如何导出数据库中的存储过程、事件、视图等?
每日一记:Oracle升级2020年4月份的数据库补丁Database Patch Set Update : 11.2.0.4.200414 (30670774)
网友评论