您的位置:首页 > 数据库 > Oracle

Oracle异常处理

2016-08-19 15:56 239 查看
--异常处理

/*BEGIN

         sequence_of_statements;

EXCEPTION

          WHEN <exception_name> THEN

                      sequence_of_statements;

          WHEN OTHERS THEN

                       sequence_of_statements;

END;

*/

常用的函数和过程:

SQLCODE: 返回错误代码,没有错误时返回0

SQLERRM:返回错误消息.

PRAGMA EXCEPTION_INIT():把用户自定义异常与相应的错误代码关联,使用用户自定义异常来捕获、处理错误

RAISE_APPLICATION_ERROR:可用于定义用户错误消息和在使用该过程的位置上暂 停程序的执行。

异常的分类:
--1)系统预定义异常

  --根据部门编号查询员工信息

  select * from emp where deptno=100;

  

  declare

      v_ename emp.ename%type; 

      v_deptno emp.deptno%type:=&no;  --输入部门编号

  begin

    select ename into v_ename from emp where deptno=v_deptno;

     DBMS_OUTPUT.PUT_LINE(v_ename);

     --处理异常

     exception

       /* when NO_DATA_FOUND   then

           DBMS_OUTPUT.PUT_LINE('没有找到!'); */

         when TOO_MANY_ROWS   then

           DBMS_OUTPUT.PUT_LINE('返回多条数据!'); 

         WHEN OTHERS THEN

             DBMS_OUTPUT.PUT_LINE('错误号:'||sqlcode||'-->消息:'||sqlerrm); 

     

  end;

  

  

select * from emp;

select * from dept;

--2)未预定义的异常  **

--实现修改编号为7788 的雇员所属的部门编号为99

  declare

      v_empno emp.empno%type:=&no;  --编号为7788  

        --声明异常

        ex exception;  --异常情况> EXCEPTION;

        --与标准的Oracle 错误联系起来,使用EXCEPTION_INIT 语句:

        pragma EXCEPTION_init(ex,-2291);   -- PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);

  begin

    update emp set deptno=99 where empno=v_empno;

    

    --处理异常

     exception

       when ex then

         DBMS_OUTPUT.PUT_LINE('----->违反完整约束条件'); 

       WHEN OTHERS THEN

          DBMS_OUTPUT.PUT_LINE('错误号:'||sqlcode||'-->消息:'||sqlerrm);  

  end;

--3)自定义异常

DECLARE

name varchar(10);

ex EXCEPTION;   --(1)定义异常ex

BEGIN

SELECT DNAME INTO name FROM DEPT WHERE DEPTNO='10';

DBMS_OUTPUT.PUT_LINE(name);

IF NAME<>'HR' THEN

RAISE ex;        --(2)触发异常

END IF;

--(3)处理异常

EXCEPTION

WHEN ex THEN

DBMS_OUTPUT.PUT_LINE('10号部门不是HR');  --处理异常

END;

--查询编号为7788 的雇员的福利补助(comm 列)

select * from emp where empno=7788;

declare

   v_comm emp.comm%type;

   

   --1)声明异常

   ex exception;

begin

    select comm into v_comm from emp where empno=7369;

    

    --判断

    if v_comm is null then

       raise ex;  --2)抛出异常

    end if;

    

   dbms_output.put_line(v_comm);

    

    --3)处理异常

     exception

       when ex then

          dbms_output.put_line('7788 的雇员无福利补助!');

         

end;

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: