例外:是一种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';