异常处理
--异常处理分为预定义异常处理,非预定义异常处理,和自定义异常处理。
<1>.预定义异常处理
常见的Oracle已预定好的异常有:
异常名称 ORACLE错误 说明
CURSOR_ALREADY_OPEN ORA-6511 试图打开一个已打开的光标
DUP_VAL_ON_INDEX ORA-0001 试图破坏一个唯一性限制
INVALID_CURSOR ORA-1001 试图使用一个无效的光标
INVALID_NUMBER ORA-1722 试图对非数字值进行数字操作
LOGIN_DENIED ORA-1017 无效的用户名或者口令
NO_DATA_FOUND ORA-1403 查询未找到数据
NOT_LOGGED_ON ORA-1012 还未连接就试图数据库操作
PROGRAM_ERROR ORA-6501 内部错误
ROWTYPE_MISMATCH ORA-6504 主变量和光标的类型不兼容
STORAGE_ERROR ORA-6500 内部错误
TIMEOUT_ON_RESOURCE ORA-0051 发生超时
TOO_MANY_ROWS ORA-1422 SELECT INTD命令返回的多行
TRANSACTION_BACKED_OUT ORA-006 由于死锁提交被退回
VALUE_ERROR ORA-6502 转换或者裁剪错误
ZERO_DIVIDE ORA-1476 试图被零除
--eg:
declare
va number;
begin
va:=6;
dbms_output.put_line(va/0);
exception
when zero_divide then --zero_divide 是oracle内已经定义好的异常 可直接用.
dbms_output.put_line('被零整除了!');
end;
<2>.非预定义的异常处理
alter table emp modify --修改表emp使其empno不能为空
(empno not null);
declare
e_nullin exception; --自定义一个异常变量
pragma exception_init(e_nullin ,-01400);--将异常变量与标准oracle联系起来
begin
insert into emp values(null,'huam','kasdk',null,null,3000,600,10);
exception
when e_nullin then --利用异常 变量对其进行异常处理
dbms_output.put_line('你插入的empno值不能为空!');
end;
***预定义异常处理与非预定义异常处理的主要不同点在于 预定义异常中oracle既定义了错误信息
又定义了错误名称,而预定义异常处理中oracle只定义了错误信息,而没有定义错误名称,在使用
中还须要我们自已定义错误名称后再与错误信息相连之后才能使用。
<3>.自定义的异常处理
drop table emp--删除以前使用后的emp
create table emp as select * from SCOTT.emp --拷emp表
alter table emp
add constraint emp_ck check(sal>500 and sal <10000); --修改emp表使其sal在500--10000之间
declare
e_myexecption exception;--定义一个异常 变量
pragma exception_init(e_myexecption,-8888);--与自已定义的错误信息连接起来(这里的错误信息是oracal内不存在的)
aa number:=&sal;--从键盘接收数据
begin
if aa>10000 or aa<500 then
raise e_myexecption;--自定义异常必须要显示的抛出异常
else
update emp set sal=aa where empno =7788;
end if;
exception --当输入的不在500-10000之间时会异常处理
when e_myexecption then
dbms_output.put_line('你输入的工资超出500-10000之间!');
end;
<4>异常函数
当oracle出现异常时我们可以通过sqlcode来取的oracle的错误号,
利用sqlerrm可以取的错误文本信息 这两个函数在任何异常中都可
以用,但一般都用在others句子,others子句是异常处理的最后一
个重要环节。
--如在上题中当用户输入的不是number类型时若无others句子则要出现异常.修改如下
declare
va emp.ename%type;
begin
select ename into va from emp where sal = &aa;
dbms_output.put_line('雇员名' || va);
exception
when no_data_found then
dbms_output.put_line('没有找到数据');
when others then
dbms_output.put_line('sqlcode:' || sqlcode || ' sqlerrm' || sqlerrm);
end;