首页 > 数据库 > Oracle >

oracle异常处理

2011-08-17

1、预定义的异常处理例1:更新指定员工工资,如工资小于1500,则加100;DECLARE v_empno employees.employee_id%TYPE := &empno; v_sal employees.salary%TYPE;BEGIN SELECT salary INTO v_sal FROM ...

1、预定义的异常处理

例1:更新指定员工工资,如工资小于1500,则加100;
DECLARE
v_empno employees.employee_id%TYPE := &empno;
v_sal employees.salary%TYPE;
BEGIN
SELECT salary INTO v_sal FROM employees WHERE employee_id = v_empno;
IF v_sal<=1500 THEN
UPDATE employees SET salary = salary + 100 WHERE employee_id=v_empno;
DBMS_OUTPUT.PUT_LINE(&#39;编码为&#39;||v_empno||&#39;员工工资已更新!&#39;);
ELSE
DBMS_OUTPUT.PUT_LINE(&#39;编码为&#39;||v_empno||&#39;员工工资已经超过规定值!&#39;);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(&#39;数据库中没有编码为&#39;||v_empno||&#39;的员工&#39;);
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE(&#39;程序运行错误!请使用游标&#39;);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||&#39;---&#39;||SQLERRM);
END;

2、非预定义的异常处理(对于这类异常情况的处理,首先必须对非定义的ORACLE错误进行定义.)步骤如下:

1. 在PL/SQL 块的定义部分定义异常情况(<异常情况> EXCEPTION;)
2. 将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句:
PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);
3. 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

例2:删除指定部门的记录信息,以确保该部门没有员工。
INSERT INTO departments VALUES(50, &#39;FINANCE&#39;, &#39;CHICAGO&#39;);
DECLARE
v_deptno departments.department_id%TYPE := &deptno;
deptno_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT(deptno_remaining, -2292);
/* -2292 是违反一致性约束的错误代码 */
BEGIN
DELETE FROM departments WHERE department_id = v_deptno;
EXCEPTION
WHEN deptno_remaining THEN
DBMS_OUTPUT.PUT_LINE(&#39;违反数据完整性约束!&#39;);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||&#39;---&#39;||SQLERRM);
END;

3、用户自定义的异常处理

1. 在PL/SQL 块的定义部分定义异常情况:
<异常情况> EXCEPTION;2. RAISE <异常情况>;3. 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

例3:更新指定员工工资,增加100;
DECLARE
v_empno employees.employee_id%TYPE :=&empno;
no_result EXCEPTION;
BEGIN
UPDATE employees SET salary = salary+100 WHERE employee_id = v_empno;
IF SQL%NOTFOUND THEN
RAISE no_result;
END IF;
EXCEPTION
WHEN no_result THEN
DBMS_OUTPUT.PUT_LINE(&#39;你的数据更新语句失败了!&#39;);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||&#39;---&#39;||SQLERRM);
END;

4、用户定义的异常处理

例4:创建一个函数get_salary, 该函数检索指定部门的工资总和,其中定义了-20991和-20992号错误,分别处理参数为空和非法部门代码两种错误:
CREATE TABLE errlog(
Errcode NUMBER,
Errtext CHAR(40));
CREATE OR REPLACE FUNCTION get_salary(p_deptno NUMBER)
RETURN NUMBER
AS
v_sal NUMBER;
BEGIN
IF p_deptno IS NULL THEN
RAISE_APPLICATION_ERROR(-20991, &rsquo;部门代码为空&rsquo;);
ELSIF p_deptno<0 THEN
RAISE_APPLICATION_ERROR(-20992, &rsquo;无效的部门代码&rsquo;);
ELSE
SELECT SUM(employees.salary) INTO v_sal FROM employees
WHERE employees.department_id=p_deptno;
RETURN v_sal;
END IF;
END;
DECLARE
V_salary NUMBER(7,2);
V_sqlcode NUMBER;
V_sqlerr VARCHAR2(512);
Null_deptno EXCEPTION;
Invalid_deptno EXCEPTION;
PRAGMA EXCEPTION_INIT(null_deptno,-20991);
PRAGMA EXCEPTION_INIT(invalid_deptno, -20992);
BEGIN
V_salary :=get_salary(10);
DBMS_OUTPUT.PUT_LINE(&#39;10号部门工资:&#39; || TO_CHAR(V_salary));
BEGIN
V_salary :=get_salary(-10);
EXCEPTION
WHEN invalid_deptno THEN
V_sqlcode :=SQLCODE;
V_sqlerr :=SQLERRM;
INSERT INTO errlog(errcode, errtext)
VALUES(v_sqlcode, v_sqlerr);
COMMIT;
END inner1;
V_salary :=get_salary(20);
DBMS_OUTPUT.PUT_LINE(&#39;部门号为20的工资为:&#39;||TO_CHAR(V_salary));
BEGIN
V_salary :=get_salary(NULL);
END inner2;
V_salary := get_salary(30);
DBMS_OUTPUT.PUT_LINE(&#39;部门号为30的工资为:&#39;||TO_CHAR(V_salary));
EXCEPTION
WHEN null_deptno THEN
V_sqlcode :=SQLCODE;
V_sqlerr :=SQLERRM;
INSERT INTO errlog(errcode, errtext) VALUES(v_sqlcode, v_sqlerr);
COMMIT;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||&#39;---&#39;||SQLERRM);
END outer;

相关文章
最新文章
热点推荐