oracle pl/sql 例外(exception) 异常

例外:是一种pl/sql 标志符,如果运行pl/sql 出现错误或警告则抛出异常


例外3种类型:预定义例外、非预定义例外,自定义例外


预定义例外:由pl/sql 所提供的系统例外

常见类型如下:

access_into_null    对象没有初始化
case_not_found      case 缺少elsif
collection_is_null  集合没有初始化
cursor_already_open 游标已经打开
dup_val_on_index    存在重复的索引
invalid_cursor      无效的游标(如游标没有打开,或关闭已经关闭的游标)
invalid_number      数字转换出现字母什么的
no_data_found       数据没有找到
too_many_rows       本来是接收单条数据,却返回了多行
zero_divide         不能用数字整除0
subscript_beyond_count   下标越界
subscript_outside_limit  下标为负
value_error 变量长度不足
login_denied  用户名密码错误
not_logged_on 没有登录数据库
program_error pl/sql 内部问题,可能需要重新安装系统包或者数据字典
rowtype_ mismatch  宿主游标变量与pl/sql 游标变量的返回类型不兼容
self_is_null 在使用对象类型时,如果null 实例上调用成员方法会导致此异常
storage_error  pl/sql 块运行时,超出内存空间或者内存被损坏
sys_invalid_rowid 将字符串转变为rowid时,必须使用有效的字符串
timeout_on_resource oracle 在等待资源时超时

   ===============================================================

非预定义例外:处理与预定义例外无关的oracle 错误。
  定义例外-->关联例外和错误-->引用例外
  eg;
   declare
      e_integraity EXCEPTION;
      PRAGMA EXCEPTION_INIT(e_integraity,-2291);
   begin
      update emp set deptno=&dno where empno=&eno;
   EXCEPTION
      when e_integrity then
           dbms_output.put_line('该部门不存在!');
   end;  


 ========================================================
  自定义例外 :是指有pl/sql 开发人员所定义的例外。预定义例外和非预定义例外都与
              oracle 错误有关,并且出现oracle 错误时会隐含触发相应例外;而自定义
              例外与oracle 错误没有任何关联, 
    步骤;定义例外--> 显示触发例外--> 引用例外
     
      declare
         e_integrity exception;
         PRAGMA EXCEPTION_INIT(e_integrity ,-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_integrity then
              dbms_output.put_line('该部门不存在');
         when e_no_employee then
              dbms_output.put_line('该雇员不存在');
 
      end;


============================================
使用例外函数
  sqlcode 用于返回错误号
  sqlerrm 返回错误号所对应的消息
  raise_application_error() 该过程用于在pl/sql 中定义错误消息,
                            只能用与(包,函数,存储过程,触发器),不能用于匿名块和客户端子程序

==============================================================================


pl/sql 编译警告:为了提高pl/sql 子程序的健壮性并避免错误,在编写程序时可以激活警告检查。
  并提高程序性能。
pl/sql 警告分类。
    SERVER:用于检查可能出现的不可预料结果或错误结果,例如别名。
    PERFORMANCE: 该类警告用于检查可能引起的性能问题,例如在执行insert
                 操作时为NUMBER 列提供了VARCHAR2类型的数据。
    INFORMATIONAL: 该类警告用于检查子程序的死代码。
    ALL: 该类关键字用于检查所有警告(SERVER,PREFORMACE,INFORMATIONAL)

   可以使用 alter system/session 激活或禁止警告
    eg; alter system set plsql_warnings='ENABLE:ALL';
        alter system set plsql_warnings='ENABLE:PERFORMANCE';
 


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值