使用Oracle EXCEPTION
抛出异常:
通过RAISE语句,用户自定义异常可以被显式抛出,预定义异常是当有关oracle错误产生时隐式抛出的。当与异常无关的某oracle错误产生时,也会产生异常。这种异常可以被OTHERS处理器捕获。预定义异常也可以通过RAISE语句显式抛出。异常抛出后就可以通过Exception when对异常进行处理。
DECLARE v_test1 NUMBER(2); v_test2 NUMBER(2); v_err_code NUMBER; v_err_info VARCHAR(200); cust_exception EXCEPTION; BEGIN v_test1 := 1; v_test2 := 2; IF v_test1 < v_test2 THEN RAISE cust_exception; END IF; EXCEPTION WHEN OTHERS THEN v_err_code := SQLCODE; v_err_info := substr(SQLERRM, 1, 200); dbms_output.put_line('ORA-' || v_err_code||': '||v_err_info); END; /
通用异常处理:
EXCEPTION
WHEN OTHERS THEN
v_err_code := SQLCODE;
v_err_info := substr(SQLERRM, 1, 200);
dbms_output.put_line('ORA-' || v_err_code || ': ' || v_err_info);
oracle错误信息的最大长度为512字节,SQLCODE返回当前错误代码,SQLERRM返回当前错误信息(预定义的异常中包含了错误代码,dbms_output.put_line(v_err_info);)。SQLCODE和SQLERRM的值先赋给本地变量,然后才能用于SQL语句中,因为这些函数是过程化的,它们不能直接用于SQL语句中。
EXCEPTION_INIT编译指示:
这可以将自定义的异常与某特定oracle错误关联起来。通过这种方式就能够捕获这种特定错误,而不是通过OTHERS处理器。SQLCODE与SQLERRM将返回所发生的oracle错误的代码和消息文本,而不是返回1与"User-Defined Exception".
SQL> DECLARE 2 v_err_code NUMBER; 3 v_err_info VARCHAR2(200); 4 e_MissingNull EXCEPTION; 5 PRAGMA EXCEPTION_INIT(e_MissingNull, -1400);--使用编译指示 6 BEGIN 7 INSERT INTO emp (empno) VALUES (NULL); 8 EXCEPTION 9 WHEN e_MissingNull THEN 10 v_err_code := SQLCODE; 11 v_err_info := substr(SQLERRM, 1, 200); 12 dbms_output.put_line(v_err_code); 13 dbms_output.put_line(v_err_info); 14 END; 15 / -1400 ORA-01400: 无法将 NULL 插入 ("SCOTT"."EMP"."EMPNO") PL/SQL procedure successfully completed
使用RAISE_APPLICATION_ERROR:
通过它可以创建自己的错误消息,比命名异常更具有描述性。
RAISE_APPLICATION_ERROR(error_number,error_message,[keep_error]);
error_number介于-20000~-20999之间,error_message错误消息文本,keep_error是一个boolean值。
本文详细介绍Oracle中的异常处理机制,包括如何使用RAISE语句抛出自定义异常,如何利用EXCEPTION WHEN OTHERS THEN来捕获未指定的异常,以及如何通过PRAGMA EXCEPTION_INIT指令将自定义异常与特定Oracle错误关联。
1万+

被折叠的 条评论
为什么被折叠?



