plsql 异常分为:
系统异常
oracle 定义了错误编号甚至错误名字的异常
系统异常分为预定义异常和非预定义异常
预定义异常:
有错误编号也有错误名字
预定义异常:
有错误编号无错误名字
自定义异常
根据自己的业务需求,自已的异常
异常处理的方法:
异常处理的完整流程:
定义异常->抛出异常->捕获及处理异常
在这这个完整流程中,有些过程根据异常的类型不同而有处省略
处理预定义异常
常见的预定义异常
NO_DATA_FOUND 一个select 语句没有查询到数据
TOO_MANY_ROWS select返回了多行数据 into 到变量
ZERO_DIVIDE 发生了零除
DUL_VAL_ON_INDEX 试图在在唯一约束的列上存储重复值
预定义的异常处理方法:
捕获及处理就可以了,定义、抛出可以省略
例:
DECLARE
v_name scott.emp.ename%type;
BEGIN
select ename into v_name from scott.emp where empno=&a;
dbms_output.put_line('Name: '||v_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line(chr(13));
dbms_output.put_line('no data found!');
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line('too many rows!');
END;
/
处理非预定义异常
非预定义异常有错误号没有名字,处理的办法是:自己定义一个名字,绑定到错误号,捕获错误名
DECLARE
myexcp EXCEPTION;
PRAGMA EXCEPTION_INIT(myexcp,-02292);
dno scott.emp.deptno%type;
BEGIN
dno:=&inputno;
delete from scott.dept where deptno=dno;
EXCEPTION
WHEN myexcp THEN
delete from scott.emp where deptno=dno;
delete from scott.dept where deptno=dno;
END;
/
自定义异常处理
流程:
定义异常->抛出异常->捕获及处理异常
例:定义一个异常,往scott.emp表中插数据,如果工资少于1500 抛出异常,不能让他插
DECLARE
v_no scott.emp.empno%type;
v_name scott.emp.ename%type;
v_sal scott.emp.sal%type;
myexcp EXCEPTION;
BEGIN
v_no:=&inputno;
v_name:=&inputname;
v_sal:=&inputsal;
if v_sal<1500 then
raise myexcp;
end if;
insert into scott.emp (empno,ename,sal) values (v_no,v_name,v_sal);
EXCEPTION
WHEN myexcp THEN
insert into scott.emp (empno,ename,sal) values (v_no,v_name,1500);
END;
/
系统异常
oracle 定义了错误编号甚至错误名字的异常
系统异常分为预定义异常和非预定义异常
预定义异常:
有错误编号也有错误名字
预定义异常:
有错误编号无错误名字
自定义异常
根据自己的业务需求,自已的异常
异常处理的方法:
异常处理的完整流程:
定义异常->抛出异常->捕获及处理异常
在这这个完整流程中,有些过程根据异常的类型不同而有处省略
处理预定义异常
常见的预定义异常
NO_DATA_FOUND 一个select 语句没有查询到数据
TOO_MANY_ROWS select返回了多行数据 into 到变量
ZERO_DIVIDE 发生了零除
DUL_VAL_ON_INDEX 试图在在唯一约束的列上存储重复值
预定义的异常处理方法:
捕获及处理就可以了,定义、抛出可以省略
例:
DECLARE
v_name scott.emp.ename%type;
BEGIN
select ename into v_name from scott.emp where empno=&a;
dbms_output.put_line('Name: '||v_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line(chr(13));
dbms_output.put_line('no data found!');
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line('too many rows!');
END;
/
处理非预定义异常
非预定义异常有错误号没有名字,处理的办法是:自己定义一个名字,绑定到错误号,捕获错误名
DECLARE
myexcp EXCEPTION;
PRAGMA EXCEPTION_INIT(myexcp,-02292);
dno scott.emp.deptno%type;
BEGIN
dno:=&inputno;
delete from scott.dept where deptno=dno;
EXCEPTION
WHEN myexcp THEN
delete from scott.emp where deptno=dno;
delete from scott.dept where deptno=dno;
END;
/
自定义异常处理
流程:
定义异常->抛出异常->捕获及处理异常
例:定义一个异常,往scott.emp表中插数据,如果工资少于1500 抛出异常,不能让他插
DECLARE
v_no scott.emp.empno%type;
v_name scott.emp.ename%type;
v_sal scott.emp.sal%type;
myexcp EXCEPTION;
BEGIN
v_no:=&inputno;
v_name:=&inputname;
v_sal:=&inputsal;
if v_sal<1500 then
raise myexcp;
end if;
insert into scott.emp (empno,ename,sal) values (v_no,v_name,v_sal);
EXCEPTION
WHEN myexcp THEN
insert into scott.emp (empno,ename,sal) values (v_no,v_name,1500);
END;
/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21175589/viewspace-755639/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21175589/viewspace-755639/