PL/SQL异常处理学习之——如何编写健壮的程序

来源:互联网 发布:汉诺塔的非递归算法 编辑:程序博客网 时间:2024/05/18 01:15

程序中经常会出现写不友好的事情,导致程序瘫痪,所以我们有必要处理这些异常。下面我就来总结下PL/SQL异常处理需要知道的知识。

一、经常用到的内置PL/SQL异常

1、No_data_found:当select语句没有返回行时可能引发该异常。经常发生在用隐式游标执行SELECT INTO操作时。其异常代码为ORA-01403。

2、Too_many_rows:在只应该返回但行记录却返回多行记录时引发该异常。其异常代码为ORA-01422。

3、Dup_val_on_index:当视图把一条记录插入到一个表中,且这个表有一个主键,而插入记录的主键值在表中已存在时,引发该异常。其异常代码为ORA-00001。

4、Value_error:试图把一个值赋给一个变量且值与变量的数据类型不兼容时引发异常。或者把一个太大的值插入到一个已定义长度的字段时也会引发该异常。其异常代码为ORA-06502。

5、Zero_divide:试图以0作除数时引发该异常。异常代码为ORA-0146。

6、Others:该异常用于捕获那些指定异常处理不处理的所有异常,常放在异常处理的最后。其异常代码不确定。

二、如何自定义一个异常,示例如下:

Declare     L_counter number :=0;     L_name employee.employee_name%type;    Cursor get_employee_name is Select employee_name From employee; --定义一个显式游标get_employee    excep_old_friend Exception; --定义一个异常excep_old    never_met_them Exception; --定义一个异常never_met_themBegin     Open get_employee_name; -- 打开游标     Fetch get_employee_name into l_name;     If l_name = 'Mr K' then           Raise excep_old_friend;    Else           Raise excep_naver_met_them;     End if;     Close get_employee_name;--要记得关闭游标,不然会出现内存泄露等不良后果Exception       When excep_old_friend then                 Dbms_output.put_line('I have a cat');       When excep_naver_met_them then                Dbms_output.put_line(''I have a dog);End;

细心的读者应该已经发现,上面用到了一个词Raise,对,这个词很关键,因为它是异常引发的代码,也就是执行异常的代码。而需要注意的是要使用Raise引发异常,必须在Exception中有声明。

三、异常处理中使用到的伪劣sqlcode和sqlerrm

和rownum、rowid、sysdate等伪劣一样,sqlcode和sqlerrm是异常处理中用到的伪劣,它们的实质其实是函数。

程序中总是会出现很多的问题,有些你根本无法预测,这是我们可以使用这两个函数进行抓取异常。如下示例所示:

--省略部分代码Exception       When excep_old_friend then                 Dbms_output.put_line('I have a cat');       When excep_naver_met_them then                Dbms_output.put_line(''I have a dog);       When Others then                Dbms_output.put_line('Oracle Error:'||sqlcode);                Dbms_output.put_line('Oracle error message is:'||sqlerrm);
可以看到,通过Others的异常监控,我们可以得到未预测的反馈信息,好做处理。

原创粉丝点击