试图被零除 ORA-1722
Invalid-NUMBER 转换一个数字失败 ORA-6500 Storage-error
内存不够引发的内部错误 ORA-6501 Program-error 内部错误 ORA-6502 Value-error
转换或截断错误 ORA-6504
Rowtype-mismatch
宿主游标变量与 PL/SQL变量有不兼容行类型 ORA-6511
CURSOR-already-OPEN
试图打开一个已处于打开状态的游标 ORA-6530
Access-INTO-null
试图为null 对象的属性赋值 ORA-6531
Collection-is-null
试图将Exists 以外的集合( collection)方法应用于一个null pl/sql 表上或varray上 ORA-6532
Subscript-outside-limit
对嵌套或varray索引得引用超出声明范围以外 ORA-6533
Subscript-beyond-count
对嵌套或varray 索引得引用大于集合中元素的个数.
示例代码:
使用select into语句检索emp表中部门编号为10的雇员记录信息,然后使用‘too_many_rows’预定义异常捕获错误信息并输出,代码如下: declare
var_empno number;
var_ename varchar2(50); begin
select empno, ename into var_empno, var_ename from emp where deptno=10; if sql%found then
dbms_output.put_line(var_empno||' '||var_ename); end if;
exception
when too_many_rows then
dbms_output.put_line(\返回记录超过一行\ when no_data_found then
dbms_output.put_line(\无数据记录\ --处理所有的错误 when others then
dbms_output.put_line(SQLCODE||'----'||SQLERRM); end; /
注意:
oracle系统内部规定不允许select into语句的返回行数超过一行,所以,必然会引发异常,即引发too_many_rows系统预定义异常。
5-2 自定义异常
oracle系统内部的预定义异常仅仅20多个,而实际程序运行过程中可能产生几千个异常情况,为此oracle经常使用错误编号和相关描述输出异常。另外,程序员可以根据实际的业务需求定义一些特殊的异常,这样oracle的自定义异常分为:错误编号异常和业务逻辑异常两种。
5-2-1 错误编号异常
错误编号异常指的是:oracle系统发生错误时,系统会显示错误编号和相关的异常信息。 对于这种异常,首先在声明部分使用exception类型定义一个异常变量名,然后使用语句pragme exception_init为“错误编号”关联这个异常变量名,接下来可以像对待系统预定义异常一样来处理。 实际演示:
向dept表中插入一个部门编号为10的记录(事先已知,10已经存在,并且dept为唯一主键),执行insert操作,会显示-0001的错误编号。
定义错误编号为\的异常变量,然后向dept表中插入一条“违反唯一约束条件”的记录,最后在exception代码块输出异常提示信息。 declare
v_exception_key exception; --定义一个异常变量
pragma exception_init(v_exception_key,-00001); --关联错误号和异常变量名
begin
insert into dept values(1,'','');
exception
when v_exception_key then
dbms_output.put_line('违反主键约束'); -- when NO_DATA_FOUND then
-- dbms_output.put_line('没有数据');
--处理所有的错误 when others then
dbms_output.put_line(SQLCODE||'----'||SQLERRM); end;
5-2-2 业务逻辑异常—符合数据库的规范,但是,不符合现实逻辑。
在实际的应用中,程序开放人员可以根据具体的业务逻辑规则自定义一个异常。这样,当用户违反业务逻辑规则时,引发一个自定义异常,从而中断程序的正常执行并转向自定义的异常处理部分。
注意:预定义异常和上面的错误编号异常,由oracle系统判断的错误,但是,业务逻辑异常,不是由oracle来判断,而是由程序自己处理,即需要一个引发异常的机制:RAISE语句实现。 示例代码:
自定义一个异常变量,向dept表中插入数据时,若判断loc字段的值为null, 则使用raise语句引发异常,并将程序的执行流程转入到exception部分进行处理。 declare
null_exception exception; dept_row dept%rowtype; begin
dept_row.deptno:=66;
dept_row.dname:='公关部'; insert into dept
values(dept_row.deptno, dept_row.dname, dept_row.loc); if dept_row.loc is null then raise null_exception; end if; exception
when null_exception then
dbms_output.put_line('loc字段的值不许为null'); rollback; end; /
注意:使用desc dept查看dept表的信息,其loc字段可以为null,但是,我们在程序设计时,可能要求必须填写,所以,可以通过自定义业务逻辑来限制loc字段的值不为空。 习题
1.使用loop语句,求10!,并输出到屏幕
2. 把emp表中的管理人员的工资下调5%, 使用隐式游标,输出下调工资的人数。
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新资格考试认证数据库讲义--2--游标、异常(课堂版) (2)全文阅读和word下载服务。
相关推荐: