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

 

 

你可能感兴趣的:(oracle,sql)