PL/SQL异常处理方法(三)
5 PRAGMA EXCEPTION_INIT(e_invalid_department,-20188); --把异常和异常
号绑定;
6 BEGIN
7 UPDATE departments
8 SET department_name =v_name
9 WHERE department_id = v_deptno;
10
11 IF SQL%NOTFOUND THEN
12
13 RAISE_APPLICATION_ERROR(-20188,'I write my error message here !');
14 END IF;
15 COMMIT;
16 EXCEPTION
17 WHEN e_invalid_department THEN
18 DBMS_OUTPUT.PUT_LINE(SQLCODE || '--->' || SQLERRM);
19 END;
20
21 /
-20188--->ORA-20188: I write my error message here !
PL/SQL 过程已成功完成。
说明:RAISE_APPLICATION_ERROR ( )
RAISE_APPLICATION_ERROR是一个内建的存储过程,这个存储过程可以显示用户
自定义的错误信息和错误号 ,这些错误号是Oracle开放出来供开发者用的,
范围为:-20000 and -20999
当使用RAISE_APPLICATION_ERROR的时候,所以以前的事务不提交,自动回滚。
语法格式如下:
RAISE_APPLICATION_ERROR (error_number, error_message);
使用RAISE_APPLICATION_ERROR步骤如下:
1:首先在Declaration区域自定义一个exception,
2:在特定的逻辑规则下出现 Raise 用户自定义的exception
3:最后 catch 这个异常,在捕获后使用RAISE_APPLICATION_ERROR这个过程链接
自定义的错误号和错误信息。
重点: 关于异常的传播机制:
比较以下三个例子就会明白异常的传播机制:
ex1:
[sql]
CREATE OR REPLACE PROCEDURE add_more_departments(p_name1 VARCHAR2, p_mgr1 NUMBER, p_loc1 NUMBER,p_name2 VARCHAR2, p_mgr2 NUMBER, p_loc2 NUMBER) IS
BEGIN
INSERT INTO departments(department_id,department_name,manager_id,location_id)VALUES(departments_seq.NEXTVAL,p_name1,p_mgr1,p_loc1);
DBMS_OUTPUT.PUT_LINE('Add Dept: ' || p_name1);
INSERT INTO departments(department_id,department_name,manager_id,location_id)VALUES(departments_seq.NEXTVAL,p_name2,p_mgr2,p_loc2);
DBMS_OUTPUT.PUT_LINE('Add Dept: ' || p_name2);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Err: adding dept:');
END;
/
CREATE OR REPLACE PROCEDURE create_more_departments
IS
BEGIN
add_more_departments('Media',100,1800,'Editing',99,1800);
END;
/
BEGIN
create_more_departments;
END;
这个例子中 99这条记录在表中本来就有,现在再次进行插入,会冲突报错
执行结果:以上两个insert 只有第一个插入进去了,第二个插入失败。
执行结果如下:
SQL> /
Add Dept: Media
Err: adding dept:
PL/SQL 过程已成功完成。
DEPARTMENT_ID DEPARTMENT_NAME
------------- ------------------------------
230 IT Helpdesk
240 Government Sales
250 Retail Sales
260 Recruiting
270 Payroll
340 Media
已选择28行。
只有第一条被插入
ex2:
在做第二个例子前先把上次的实验结果删除掉:
delete from departments where department_id >270;
select department_id,department_name from departments order by 1;
[sql]
CREATE OR REPLACE PROCEDURE add_more_departments(p_name1 VARCHAR2, p_mgr1 NUMBER, p_loc1 NUMBER,p_name2 VARCHAR2, p_mgr2 NUMBER, p_loc2 NUMBER) IS
BEGIN
INSERT INTO departments(department_id,department_name,manager_id,location_id)VALUES(departments_seq.NEXTVAL,p_name1,p_mgr1,p_loc1);
DBMS_OUTPUT.PUT_LINE('Add Dept: ' || p_name1);
INSERT INTO departments(department_id,department_name,manager_id,location_id)VALUES(departments_seq.NEXTVAL,p_name2,p_mgr2,p_loc2);
DBMS_OUTPUT.PUT_LINE('Add Dept: ' || p_name2);
END;
/
CREATE OR REPLACE PROCEDURE create_more_departments
IS
B