当前位置: 代码迷 >> SQL >> PL/SQL复习八 错误
  详细解决方案

PL/SQL复习八 错误

热度:117   发布时间:2016-05-05 14:23:52.0
PL/SQL复习八 异常

异常分类:

1. 预定义异常: 处理常见的oracle错误

2. 非预定义异常: 处理预定义异常之外不能处理的错误

3. 自定义异常: 处理和oracle错误无关的其他情况

?

declare

??v_ename emp.ename%type;

begin

??select ename into v_ename from emp where empno = &no;

??dbms_output.put_line('雇员名:' || v_ename);

exception --以下是异常处理部分

??when no_data_found then

?? ?dbms_output.put_line('雇员号不正确,请核实雇员号!');

??when others then

?? ?dbms_output.put_line('未知异常');

end;

/

?

---------------------------------------------------------------------------------------------

?

常见预定义异常:

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 INTO命令返回的多行

TRANSACTION_BACKED_OUT ?ORA-006 ? 由于死锁提交被退回

VALUE_ERROR ? ? ? ? ? ? ORA-6502 ?转换或者裁剪错误

ZERO_DIVIDE ? ? ? ? ? ? ORA-1476 ?试图被零除

?

---------------------------------------------------------------------------------------------

?

使用非预定义异常:deptno是外键,如果输入的deptno在dept表中不存在,就会触发异常

declare

??e_exception1 exception;--定义异常名

??pragma exception_init(e_exception1, -2291);--将异常和oracle错误之间建立关联

begin

??update emp set deptno = &dno where empno = &eno;

exception

??when e_exception1 then

?? ?dbms_output.put_line('该部门不存在');

end;

/

?

?

使用自定义异常:

declare

??e_exception1 exception;

??pragma exception_init(e_exception1, -2291);

??e_no_employee exception; --自定义异常

begin

??update emp set deptno = &dno where empno = &eno;

??if sql%notfound then --如果人员不存在?

?? ?raise e_no_employee; --则抛出自定义异常

??end if;

exception

??when e_exception1 then

?? ?dbms_output.put_line('该部门不存在');

??when e_no_employee then

?? ?dbms_output.put_line('该雇员不存在');

end;

/

?

---------------------------------------------------------------------------------------------

?

异常函数:

sqlcode: 返回错误号

sqlerrm: 返回异常消息

exception

??when others then

?? ?dbms_output.put_line('错误号:'||sqlcode);

?? ?dbms_output.put_line('错误消息:'||sqlerrm);

?

raise_application_error: 用于自定义错误消息,只能在子程序(过程、函数、包、触发器中使用) 不能在匿名块和客户端的子程序中使用

?

?

  相关解决方案