ITPub博客

首页 > 数据库 > Oracle > 异常处理与异常函数

异常处理与异常函数

原创 Oracle 作者:skyin_1603 时间:2016-11-12 23:42:53 0 删除 编辑

在执行PLSQL程序的时候,有时候程序的执行过程中多多少少会遇到一些异常,
数据库中已经编写好各种各样的异常代码与异常描述。当然我们根据实际的问题与情况,
还可以自己定义以下异常,定义异常,抛出异常等环节来解决异常,从而能够使程序顺利执行。
以下是一些异常的使用,并定义了一些异常。

----异常处理:

---异常解决:

scott@PROD>set serveroutput on

scott@PROD>

scott@PROD>DECLARE

  2  v_deptno dept.deptno%TYPE := &deptno;

  3  v_dname  dept.dname%TYPE;

  4  v_str varchar2(50);

  5  BEGIN

  6  SELECT dname INTO v_dname FROM dept WHERE deptno = v_deptno;

  7  select decode(mod((40-length(v_dname))/2,2),0,lpad('*',(40-length(v_dname))/2,'*'),

  8  lpad('*',trunc((40-length(v_dname))/2),'*'))||v_dname||

  9  decode(mod((40-length(v_dname))/2,2),0,lpad('*',(40-length(v_dname))/2,'*'),

 10  lpad('*',trunc((40-length(v_dname))/2),'*')) into v_str from dual;

 11  dbms_output.put_line('****************************************');

 12  dbms_output.put_line(v_str);

 13  dbms_output.put_line('****************************************');

 14  EXCEPTION

 15  WHEN NO_DATA_FOUND THEN

 16  dbms_output.put_line('haha');

 17  WHEN TOO_MANY_ROWS THEN

 18  dbms_output.put_line('hehe');

 19  WHEN others THEN

 20    NULL;

 21  END;

 22  /

Enter value for deptno: 20

old   2: v_deptno dept.deptno%TYPE := &deptno;

new   2: v_deptno dept.deptno%TYPE := 20;

****************************************

****************RESEARCH****************

****************************************

PL/SQL procedure successfully completed.

 

scott@PROD>

#程序执行完成。
 

---使用异常函数:

hr@PROD>DECLARE

  2  v_deptno NUMBER := 500;

  3   v_name   VARCHAR2(20) := 'Testing';

  4  e_invalid_department EXCEPTION;

  5  BEGIN

  6   UPDATE departments

  7   SET department_name = v_name

  8  WHERE department_id = v_deptno;

  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 procedure successfully completed.

#程序执行完成。虽然没有deptno=500的记录,但是由于使用的异常处理,这样,更新过程中的异常不会影响真个程序的执行,当中的异常交由异常函数处理。

---使用异常函数自定义异常:

hr@PROD>DECLARE

  2        v_deptno NUMBER := 270;

  3        v_name   VARCHAR2(20) := 'Testing';

  4      BEGIN

  5        UPDATE departments

  6        SET department_name = v_name

  7        WHERE department_id = v_deptno;

  8      IF SQL%FOUND THEN

  9        RAISE_APPLICATION_ERROR(-20001, 'Warning!');

 10      END IF;

 11      COMMIT;

 12      EXCEPTION

 13        WHEN OTHERS THEN

 14        DBMS_OUTPUT.PUT_LINE(SQLCODE);

 15        DBMS_OUTPUT.PUT_LINE(SQLERRM);

 16      ROLLBACK;

 17      END;

 18  /

-20001

ORA-20001: Warning!

PL/SQL procedure successfully completed.

#程序执行完成。因为部门表中是存在部门号为270的记录,所以程序返回信息。

以上程序中,虽然存在异常,但是通过自定义异常,然后把异常抛出,让程序顺利执行。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31392094/viewspace-2128351/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2016-09-06

  • 博文量
    231
  • 访问量
    215114