PL/SQL异常处理总结
来源:互联网 发布:淘宝后台手机端 编辑:程序博客网 时间:2024/06/07 21:19
一、break(即退出循环体)可用exit代替。
loop
...
exit when ...;
...
end loop;
二、continue(退出单次循环)用自定义异常代替。
loop
begin
...
raise my_ex;
...
exception
when others then null;
end;
end loop;
简单的说,异常处理,就是以一种一致的方法会机制去处理程序中的异常。
与其他程序语言一样,pl/sql的异常处理也是基于以下基本思想:
· 发现一个问题但不能处理它的函数时,引发一个异常,希望它的(直接或间接)调用者能够处理这个问题.
· 而想处理该问题的函数通过捕获这个异常来处理这个异常.
· 未捕获的异常自动往像上一层传递(按函数调用的逆序)
· 如果程序始终没有处理这个异常,最终它会被传到运行系统那里,运行系统捕获异常后通常只是简单的终止这个程序
1.定义异常
语法如下:
DECLARE
exception_name EXCEPTION;
...
BEGIN
...
EXCEPTION
WHEN excption_name THEN
...
WHEN OTHERS THEN
END;
将异常与一个代码关联
DECLARE
exception_name EXCEPTION;
PRAGMA EXECEPTION_INIT(exception_name,integer)
...
BEGIN
..
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = integer THEN
...
END;
2.抛出异常
BEGIN
IF total_sales = 0
THEN
RAISE ZERO_DIVIDE; -- Defined in STANDARD package
ELSE
RETURN (sales_percentage_calculation (my_sales, total_sales));
END IF;
END;
3.处理异常
BEGIN
...
EXCEPTION
WHEN exception1 THEN
...
WHEN exception2 OR exception3 THEN --同时处理两个异常
...
WHEN OTHERS THEN
RAISE;
END;
SQLCODE
SQLCODE相当于一个全局变量函数,保存着最近一次发生异常的异常代码。
SQLERRM
SQLERRM函数根据传入的异常代码返回对应的异常消息。SQLERRM的长度限制为512字节。
DBMS_UTILITY.FORMAT_ERROR_STACK
DBMS_UTILITY.FORMAT_ERROR_STACK RETURN VARCHAR2;
DBMS_UTILITY.FORMAT_ERROR_STACK函数返回完整的错误消息。
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE RETURN VARCHAR2;
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE用于返回发生异常时异常点的堆栈信息
DBMS_UTILITY.FORMAT_CALL_STACK
DBMS_UTILITY.FORMAT_CALL_STACK RETURN VARCHAR2;
该函数返回程序当前执行点的堆栈信息
举例:
CREATE OR REPLACE PROCEDURE proc1 IS BEGIN DBMS_OUTPUT.put_line ('running proc1'); RAISE NO_DATA_FOUND; END; / CREATE OR REPLACE PROCEDURE proc2 IS l_str VARCHAR2 (30) := 'calling proc1'; BEGIN DBMS_OUTPUT.put_line (l_str); proc1; END; / CREATE OR REPLACE PROCEDURE proc3 IS BEGIN DBMS_OUTPUT.put_line ('calling proc2'); proc2; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line ('Error stack at top level:'); DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_backtrace); END; /然后: SQL> SET SERVEROUTPUT ON SQL> BEGIN 2 DBMS_OUTPUT.put_line ('Proc3 -> Proc2 -> Proc1 backtrace'); 3 proc3; 4 END; 5 / Proc3 -> Proc2 -> Proc1 backtrace calling proc2 calling proc1 running proc1 Error stack at top level: ORA-06512: at "SCOTT.PROC1", line 4 ORA-06512: at "SCOTT.PROC2", line 5 ORA-06512: at "SCOTT.PROC3", line 4
屏蔽异常(异常的一种特殊处理方式)
如下例子:
PROCEDURE change_data ISBEGIN BEGIN DELETE FROM employee WHERE ... ; --这里发送异常,跳得第5行 EXCEPTION WHEN OTHERS THEN NULL; --并未处理异常,只是屏蔽掉了,程序的执行跳到第9行 END; BEGIN UPDATE company SET ... ; EXCEPTION WHEN OTHERS THEN NULL; END; BEGIN INSERT INTO company_history SELECT * FROM company WHERE ... ; EXCEPTION WHEN OTHERS THEN NULL; END;END;
4.构建有效的错误处理架构
尽管程序语言在语法上提供了异常处理的这种机制,但是一个完整的应用程序框架应该有一个合适的错误处理架构,在pl/sql应用程序的开发中,也应建立起这种架构,而不是随意的处理异常。
- PL/SQL异常处理总结
- PL/SQL 异常处理
- PL/SQL异常处理
- PL/SQL异常处理
- PL/SQL异常处理
- PL/SQL 异常处理
- pl/sql异常处理
- PL/SQL 异常处理
- PL/SQL异常处理
- PL SQL异常处理
- PL/SQL 异常处理
- pl/sql异常处理
- PL/SQL异常处理
- PL/SQL异常处理
- PL/SQL异常处理
- PL/SQL--异常处理
- PL/SQL 异常处理
- PL/SQL 异常处理
- mysq数据库导入
- VC的Buffer Security Check
- 通过new BitmapDrawable()方法将Bitmap转化为Drawable的getIntrinsicHeight()和getIntrinsicWidth() 问题。
- Linux下常用命令及举例
- 用javah 导出类的头文件, 常见的错误及正确的使用方法
- PL/SQL异常处理总结
- BB.Flashback.Pro.v4.1.1.2498.Cracked.by.yoza[UpK]
- memset的用法
- Android 4.2 Input 流程分析
- IOS设置静态库的生成目录为默认的build目录
- 小算法酱油笔记之数组压缩0
- ndk make: *** 没有规则可以创建
- 绑定变量(bind variables)、替换变量(substitution variables)
- 大家一起番茄吧!