PL/SQL异常处理方法(二)

2014-11-24 12:39:10 · 作者: · 浏览: 1
FILE package.
TOO_MANY_ROWS ORA-01422 You tried to execute a SELECT INTO statement and more than one row was returned.
ZERO_DIVIDE ORA-01476 You tried to divide a number by zero.
INVALID_NUMBER ORA-01722 You tried to execute an SQL statement that tried to convert a string to a number, but it was unsuccessful.
STORAGE_ERROR ORA-06500 You ran out of memory or memory was corrupted.
PROGRAM_ERROR ORA-06501 This is a generic "Contact Oracle support" message because an internal problem was encountered.
VALUE_ERROR ORA-06502 You tried to perform an operation and there was a error on a conversion, truncation, or invalid constraining of numeric or character data.
CURSOR_ALREADY_OPEN ORA-06511 You tried to open a cursor that is already open. 以上的例子中有关于命名的异常的使用方法。这里不再说了。
BEGIN
Execution section
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line ('A SELECT...INTO did not return any row.');
END;
b:未命名 系统异常:
这些系统异常没有名字,这些异常不经常出现,这些异常有错误代码和关联信息。
有两种方式处理未命名的异常:
方法一: 使用WHEN OTHERS 异常处理
方法二:给一个异常 关联异常代码和名称 ,然后像命名异常一样使用它。
方法一异常没有目标性,下面说明方法二:
使用Pragma 调用 EXCEPTION_INIT关联一个预定义的oracle错误号到程序定义的异常
下面是个demo:
DECLARE
exception_name EXCEPTION;
PRAGMA
EXCEPTION_INIT (exception_name, Err_code);
BEGIN
Execution section
EXCEPTION
WHEN exception_name THEN
handle the exception
END;
先声明异常名称,然后调用EXCEPTION_INIT函数绑定错误号码和异常名称, 绑定后这个异常名称就可以像命名式异常那样用了。
例如:
[sql]
SQL> DECLARE
2 e_insert_excep EXCEPTION; --定义异常名称
3 PRAGMA EXCEPTION_INIT(e_insert_excep,-01400); -- 关联异常名称和异
常号
4 BEGIN
5 INSERT INTO departments (department_id,department_name) VALUES(280,N
ULL);
6 EXCEPTION
7 WHEN e_insert_excep THEN
8 DBMS_OUTPUT.PUT_LINE('INSERT OPERATION FAILED');
9 DBMS_OUTPUT.PUT_LINE(SQLERRM);
10 END;
11 /
INSERT OPERATION FAILED
ORA-01400: 无法将 NULL 插入 ("HR"."DEPARTMENTS"."DEPARTMENT_NAME")
PL/SQL 过程已成功完成。
首先定义一个 e_insert_excep异常名称, 然后调用 EXCEPTION_INIT函数绑定这个异常名称,最后出现异常输出错误信息。
SQLERRM的信息如下: ORA-01400: 无法将 NULL 插入 ("HR"."DEPARTMENTS"."DEPARTMENT_NAME")
需要关联 数字和自定义的错误名称;
两个变量: SQLCODE 错误代码
SQLERRM 错误内容
当抛出异常的时候,这两个变量会被自动填充,可以获取这两个的值来判断
错误:
3:用户自定义异常:
先看三个例子再解释:
ex1:
[sql]
SQL> DECLARE
2 v_deptno NUMBER := 500;
3 v_name VARCHAR2(20) :='Testing';
4 e_invalid_department EXCEPTION;
5 BEGIN
6 UPDATE departments SET department_name = v_name
7 WHERE department_id = v_deptno;
8
9 IF SQL%NOTFOUND THEN
10 RAISE e_invalid_department;
11 END IF;
12 COMMIT;
13 EXCEPTION
14 WHEN e_invalid_department THEN
15 DBMS_OUTPUT.PUT_LINE('No such department id');
16 END;
17 /
No such department id
PL/SQL 过程已成功完成。
关于RAISE_APPLICATION_ERROR 过程;
语法:
raise_application_error(error_number,message[,{TRUE|FALSE}]);
可以通过这个过程定义一个自己的异常号和 异常信息
注意: error_number是介于: -20000..-20999的数字,message是一个
字符串最大长度为2k
[sql]
SQL> DECLARE
2 v_deptno NUMBER := 500;
3 v_name VARCHAR2(20) := 'Testing';
4 e_invalid_department EXCEPTION; --定义一个异常